1

I am reading "Accelerated C++" by Andrew Koenig and Barbara E. Moo, and I'm at the chapter about constructors (5.1).

They mention here that

We said that constructors exist to ensure that objects are created with their data members in a sensible state. In general, this design goal means that every constructor should initialize every data member. The need to give members a value is especially critical for members of built-in type. ...

Although we explicityly initialized only midterm and final, the other data members are initialized implicitly. Specifically, n is initialized by the string default constructor, and homework is initialized by the vector default constructor.

The class they are talking about is

class Student_info {
public:
    std::string name() const (return n;}
    bool valid() const {return !homework.empty();}
    std::istream& read(std::istream&);

    double grade() const;
private:
    std::string n;
    double midterm, final;
    std::vector<double> homework;
};

and their default constructor is

Student_info::Student_info(): midterm(0), final(0) {}

I would just like to clarify that this means that things like int and double where there isn't a std:: before the term will need to be initialized specifically?

4

5 に答える 5

3

それは正しいです。
しかし std:: はあなたが探しているものではありません。

明示的に行わない限り、基本型は初期化されません。

また、(以下のIanが指摘したように)明示的なコンストラクターのないクラス/共用体は、デフォルトでそのメンバーを初期化します(これchar/int/float/pointersは、基本的な(および明示的なコンストラクターのないクラス/共用体のメンバーに対して再帰的に)未定義のままであることを意味します)。

補足:

  • このルールは、自動および動的ストレージ期間オブジェクトに適用されます
  • 静的およびスレッド ストレージ期間オブジェクトはゼロ初期化されます。
于 2013-03-22T06:50:02.333 に答える
2

intおよびdoubleはクラスではなく組み込み型であるため、デフォルトのコンストラクターがなく、デフォルトでは未定義です。例えば:

int a;
Student_info s;

両方の変数の構文は同じですが、 の値は定義されていませんが、 の値は実際にコンストラクターを呼び出すため定義されてaいます。sStudent_info sStudent_info s = Student_info();

于 2013-03-22T06:48:15.160 に答える
1

作成者は、すべてがデフォルトで 0 に相当するデフォルト コンストラクタを表示しようとしています。文字列とベクトルの場合、それらは単に空になります。int や double などのプリミティブ型の場合、宣言中のこれらのプリミティブの初期値は、変数が指すメモリ内の値にデフォルト設定されます。ただし、これはコンパイラに依存します

于 2013-03-22T06:49:01.963 に答える
1

std 名前空間とは関係ありません。n と宿題はクラスであり、それらのコンストラクターは Student_info の構築中に呼び出されます。しかし、中間値と最終値はプリミティブな値であり、それらのコンストラクターはありません。コンストラクターでプリミティブメンバーを初期化する必要はありませんが、良い方法です。

于 2013-03-22T06:50:21.260 に答える
0

それだけではありません。

1)プリミティブ型または組み込み型の場合、暗黙に初期化される (またはコンパイラが初期化される) とは、何もしない (何もしない) ことを意味します。

2)プリミティブまたは組み込み型の場合、明示的に初期化(またはプログラマーによって初期化)されることは明らかです:)

あなたの例のように:

    Student_info::Student_info(): midterm(0), final(0) {}

3)非プリミティブ型の場合、暗黙に初期化される (またはコンパイラが初期化される) とは、コンパイラが初期化の目的でコンストラクタを合成できる (またはできない) ことを意味します。

 Usually, a constructor is synthesized by the compiler under the following cases:

 a) The non-primitive type is polymorphic or derives from some polymorphic/non-polymorphic types,
 b) The non-primitive type has a polymorphic/non-polymorphic member. 

 Compiler synthesized constructor will usually have code to 

 a) initialize v-pointer to v-table, 
 b) call base class constructor, 
 c) call constructors of members, so on, 

 basically driven by the definition of non-primitive type.

4)非プリミティブ型の場合、 明示的に初期化された (またはユーザー提供のコンストラクターによって初期化された) ということは、コンパイラーが、初期化のためにコンストラクターを合成する代わりに、ユーザー定義のコンストラクターを呼び出すことを意味します。

たとえば、それぞれの非プリミティブ型 (std::string や std::vector など) によって定義された既定のコンストラクターが呼び出されます。

**

注: コンパイラは、必要に応じて、ユーザー定義のコンストラクター内のコードを拡張して、バックグラウンドで初期化を行う場合があります (そのようなニーズについては、上記の手順 3 を参照してください)。このような拡張コードは、コンストラクター内のユーザー定義コードの前に常に挿入されます!

**

于 2013-03-22T07:24:47.037 に答える