0

誰かが次の意味を説明してもらえますか?

クラスがメンバー変数を定義し、他のコンストラクターがない場合は、既定のコンストラクターを定義する必要があります。そうしないと、コンパイラがあなたに代わってそれを行います。

彼らは何を「悪い」と呼んでいますか?

4

11 に答える 11

5

ctorが提供されていない場合の方法new Tnew T() 違いを参照する場合があります。

于 2011-05-24T16:40:59.160 に答える
5

そのリンクの展開から:

「これの理由は、他のコンストラクターがなく、デフォルトのコンストラクターを定義していない場合、コンパイラーが生成するためです。このコンパイラー生成のコンストラクターは、オブジェクトを適切に初期化しない可能性があります。」

于 2011-05-24T16:39:12.407 に答える
1

デフォルトのコンストラクターの唯一の問題は、コンパイラーが初期化する必要があると考えるものだけを初期化し、初期化する必要があると思うものは初期化しないことです。基本的に、これは、デフォルトの初期化子を持つオブジェクトの初期化子を呼び出すことを意味します。ポインタやint値を正しくするような単純な型などは設定されません。それで十分な場合、デフォルトのコンストラクタは「bad」ではありません。それが不十分な場合、正しい初期化で必要なデフォルトコンストラクターを定義しなかったのは(コード内の)バグです。

于 2011-05-24T16:41:44.447 に答える
1

Google スタイル ガイドを一粒の塩で、あるいはトラックいっぱいの塩で考えてみてください。

コンパイラによって生成された既定のコンストラクターが、組み込み型のメンバーを意味のある方法で初期化するとは限らないことは事実です。あなたがそれをしたいのなら、そうです、それをしないのは悪いことです。OTOH、それをしたくない場合は、それを行うのも少し悪い(無駄な)可能性があります。

結論: 独自のデフォルト ctor を作成する場合もありますが、それらはルールではなく例外に向かう傾向があります。C++ には多くのケースをカバーする簡単な経験則があり、多くの問題を防ぐことができますが、これは実際にはそれらの 1 つではありません。そして、あなたが自分で書くつもりなら、あなたが違うものを望んでいます。

于 2011-05-24T16:43:20.090 に答える
1

オブジェクトが既知の状態で作成されていることを確認することをお勧めします。プリミティブ変数はデフォルトではゼロに設定されないため、常に表示されるとは限らない微妙なバグが発生する可能性があります。メンバー変数を適切な変数に初期化することで、すべてがより予測可能になります。

于 2011-05-24T16:40:06.467 に答える
0

整数を0に設定したり、ポインタをnullに設定したりすることはありません。コンストラクターを持つ型のオブジェクトに対してデフォルトのコンストラクターを実行します。

一部の人々はそれを「賢明ではない」と呼ぶでしょう。

于 2011-05-24T16:45:05.450 に答える
0

3 のルールの単純化されたバージョンのように思えます。自分で定義するか、コンパイラ バージョンをそのままにしておく必要があります。

  • コピーコンストラクタ
  • 代入演算子
  • デストラクタ

(自分でコピー コンストラクターを定義すると、コンパイラーは既定のコンストラクターを定義しないことに注意してください)。

于 2011-05-24T16:49:46.260 に答える
0

デバッグ ビルドでは、ほとんどのコンパイラは初期化されていない領域にいくつかのマジック値を入力するため、デバッグは信頼できます。また、カスタム コンストラクターを提供すると、特定の POD の最適化が妨げられます。

于 2011-05-24T16:42:56.713 に答える
0

実際、オブジェクトの無効またはデフォルトの状態を人々が明示的に表明することを確認するためのガイドラインです。

そうすれば、実際の実行と比較して、コードを読んでも驚くことはありません。

ただし、これは会社のガイドラインであり、全員が同じルールに従うようにするためのものであり、Google が行うから従わなければならないというものではありません。

実際、デフォルトの構築時にすべてのメンバー オブジェクトを有効な状態にすることができた場合、またはコンストラクターの設定を強制した場合、そのようなガイドラインを設定する正当な理由はありません。

于 2011-05-24T16:43:25.860 に答える
0

メンバー変数としてプリミティブ型 (int、float など) がある場合、デフォルトの ctor はそれらを初期化しません。クラス型のメンバー変数では、デフォルトの ctor が呼び出されます。

メンバー初期化子リストを優先するため、ユーザーが指定した ctor が空になる場合があります。

class Foo {
 int bar;
 float baz;

 Foo(): bar(0), baz(0.0f) { /* empty ctor body */ }

};
于 2011-05-24T16:43:56.650 に答える
-1

コンパイラによって構築されたデフォルトのコンストラクタは「何もしません」、オブジェクトによって占有されているメモリをゼロにすることさえしません

于 2011-05-24T16:42:26.283 に答える