0
#include <iostream>

using namespace std;
class Apple
{
    public:
       int i;
       string s = "HelloWorld";
       string s1;
       bool b;
};

int main(int argc, char *argv[]) {
    Apple a; //doesn't this trigger default initialization??
    cout << a.i << a.s << a.s1 << a.b;

}

オブジェクトがローカル変数の場合、データメンバーはデフォルトで初期化されます。しかし、ここに出力があります:0HelloWorld0。この値の初期化ではありませんか?

4

2 に答える 2

2

これは、コードで値の初期化が実行されていないことを示す簡単なテストです。

#include <iostream>
#include <string>

using namespace std;
class Apple
{
    public:
       int i;
       string s = "HelloWorld";
       string s1;
       bool b;
};

int main() 
{
   {
     Apple a; 
     a.i = 42;
     a.b = true;
     cout << a.i << a.s << a.s1 << a.b;
   }
   {
     Apple a; 
     cout << a.i << a.s << a.s1 << a.b;
   }
   {
     Apple a{}; 
     cout << a.i << a.s << a.s1 << a.b;
   }
}

出力:

42HelloWorld142HelloWorld10HelloWorld0

ご覧のとおり、2番目のケースでは、これらのメンバーには前の割り当ての値がまだ含まれています。これが保証されている、または標準で定義されている動作であると言っているわけではないことに注意してください。

3番目のケースでは、中括弧を追加してオブジェクトを値で初期化する必要があることを示しています。

コンパイラがC++11の統一初期化構文をサポートしていない場合は、次のように変更して同じ効果を得ることができます。

Apple a = Apple();
于 2013-03-17T19:31:37.457 に答える
2

この値の初期化ではありませんか?

私のマシンでは、プログラム-1219700747HelloWorld244はデフォルトの初期化の明確な指標を出力します。

あなたが得ること0HelloWorld0は完全にランダムではなく、多くの理由があります。たとえば、それはあなたのOSアーキテクチャと関係があります。各プログラムのすべての新しいメモリは最初はゼロになっています。これが、この単純な例ではすべてがゼロに設定されている理由です。または、パフォーマンス上の理由から、コンパイラは構造体を静的に初期化します。

12.6.2 / 8の標準を引用するには:

非委任コンストラクターで、特定の非静的データメンバーまたは基本クラスがmem-initializer-idで指定されていない場合(コンストラクターにctor-initializerがないためにmem-initializer-listがない場合を含む)エンティティが抽象クラス(10.4)の仮想基本クラスではない場合、

—エンティティが中括弧または等しい初期化子を持つ非静的データメンバーである場合、エンティティは8.5で指定されているように初期化されます。

—それ以外の場合、エンティティが匿名ユニオンまたはバリアントメンバー(9.5)の場合、初期化は実行されません。

—それ以外の場合、エンティティはデフォルトで初期化されます(8.5)。

于 2013-03-17T19:27:32.330 に答える