0

私のクラスでは、そのようなフィールドを使用していました:

private:
bool firstSeqNumReceived;

trueしばらくの間、すべてが正常に機能していましたが、1 つのコミットの後、フィールドがデフォルトになっていることがわかりました。驚くべきことに、フィールドはfalseデフォルトで初期化されず、代わりに割り当てられた値は実装に依存します (詳細については、C++ クラス メンバーのデフォルト値は何ですかを参照してください)。

なぜコンパイラがコンパイル時エラーを生成せず、初期化を追加する必要があるのだろうか? 「実装依存」のデフォルト値が必要なのは誰ですか?ユースケースはありますか? この場合、コンパイル時エラーが発生しないのはなぜですか?

4

3 に答える 3

5

コンパイラがコンパイル時エラーを生成せず、初期化を追加する必要があるのはなぜですか?

コンパイラは、あなたが何をしているのかを知っていると想定しているためです。

C++ では、使用しないものに対して料金を支払う必要はありません。初期化が時間の無駄になる場合があります。たとえば、メンバーの実際の意味のある値は、オブジェクトが構築されるまで計算できない可能性があるクラスでは、メンバーをデフォルト値またはセンチネル値に初期化してもほとんど効果がありません。

于 2013-04-15T11:27:27.400 に答える
0

ユースケースは基本的に、変数を使用しているかどうかはプログラムの流れに依存するということです。コードの一部で使用しない場合は、ゼロ初期化する必要もありません。

また、値がコンストラクターまたは他のメンバー関数で割り当てられることがわかっている場合、最初に 0 をメモリに書き込むのは余計な手順になります。

于 2013-04-15T11:25:46.357 に答える
0

標準では、初期化されていないオブジェクトにアクセスすることは未定義の動作であると規定されています。このような未定義の動作が標準に表示される理由はいくつかあります。これは、あなたが求める以上のものを与えないということです。変数を作成してすぐに初期化したくない場合があります。代わりに、コンパイラは、オブジェクトの初期化が必要な場合にオブジェクトを初期化することを信頼します。自動的に初期化したくない場合の例として:

int x;
std::cin >> x;

値がすぐに上書きxされるため、自動的に初期化するのはまったく無意味です。0変数を初期化する権限は、あなたの有能な手に委ねられています。

コンパイラは、最適化を行うために未定義の動作を呼び出さないと想定する場合もあります。

于 2013-04-15T11:26:55.767 に答える