c++
1Class B{ 2 int i; 3} 4class A{ 5 B b; 6 B*ptrB; 7} 8 9A a; 10main(){ 11 a.b.i; ///0 12 a.ptrB; ///NULL 13 14 A localA; 15 localA.b.i; ///0 16 localA.ptrB; ///NULL 17} 18 19
このような理解で問題ないでしょうか?
あるいは明示的に
int i=0;
B*ptrB=NULL;
等、記述しておくべきですか?よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
こんにちは。
静的領域は全てゼロ初期化されるので以下は正しい筈です。
a.b.i; ///0
a.ptrB; ///NULL
動的領域の変数はゼロ初期化されないので以下は間違っている筈です。
localA.b.i; ///0
localA.ptrB; ///NULL
int型等の基本型やenum型は、ゼロ初期化を除き自動的には初期化されません。クラス型は初期化を省略するとデフォルト・コンストラクタで初期化されます。
ゼロ初期化のルールは非常に複雑ですし、実行されない時もあるので、原則としてゼロ初期化には頼らない方が確実と思います。そのためには、コンストラクタを定義して、全ての基本型やenum型メンバ変数を初期化するのが望ましいです。
投稿2020/02/03 02:56
編集2020/02/03 03:07総合スコア23272
0
ベストアンサー
クラスAはトリビアルなデフォルトコンストラクタです。領域確保されるだけで何もしません。ですので、自動変数であるlocalA
の中身は不定です。何になるのかは環境や実行時依存であり、予測不可能です。対して、静的変数であるa
はゼロ初期化されます。数値は0
になりますし、ポインタはnullptr
になります。どちらの場合もクラスB
のオブジェクトが作られることはありません。
この動作はCの構造体とほぼ一緒です。
投稿2020/02/02 22:25
編集2020/02/03 09:07総合スコア21739
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/03 00:22
2020/02/03 04:48
2020/02/03 09:27
2020/02/03 10:21
2020/02/03 22:43
0
あるいは明示的に
int i=0;
B*ptrB=NULL;
等、記述しておくべきですか?
デフォルトコンストラクタを用意しておきましょう。そうすれば、宣言する場所に関わらず同じ初期値をセットできます。
投稿2020/02/02 23:00
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/02 23:21
2020/02/03 03:01 編集
2020/02/03 22:45
2020/02/03 22:54
0
質問に有るような事を実際に試した訳ではないですが、ローカルで使用する(可能性が有る)クラスは“初期化子リスト”で初期化するようにしています。
投稿2020/02/02 20:30
総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/02 21:38 編集
2020/02/02 23:12
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/03 22:47