1

私のテストによると、オブジェクトは作成後も変更できます。

//Let's use this copy constructor as an example:
Foo::Foo( const Foo& F )
{
  var = F.var;
}

//With this code:
Foo f1;
const Foo f2(f1); //No Error?

初期化リストがないため、f2は作成に変更されています。では、Fooのメンバーがまだ変更可能である場合、何が一定になっているのでしょうか。

4

2 に答える 2

2

f2作成後に変更されていません。この行

const Foo f2(f1); 

を作成しf2f2コンストラクターの本体でそれ自体のデータメンバーを変更できます。コンストラクターの本体が終了すると、オブジェクトは完全に構築され、変更できなくなります。

言及する価値のあるいくつかのポイントがあります:

  • の場合、コンストラクターの初期化リストで初期化する必要があり、コンストラクターの本体で変更することはできませんvarconstこれは、const Fooインスタンスがあるかどうかとは関係ありません。
  • varが宣言されている場合、を変更するメソッドを介してインスタンスmutableを変更することが可能です。const Fooconstvar
于 2012-09-23T10:07:12.347 に答える
1

オブジェクトの存続期間は、コンストラクターが完了するまで開始されないため(C ++ 03 3.8「オブジェクトの存続期間」)、その時点までは何もありませんconst。特に、C ++ 03 12.1/4「コンストラクター」は次のように述べています。

constおよびvolatileセマンティクス(7.1.5.1)は、作成中のオブジェクトには適用されません。このようなセマンティクスは、最も派生したオブジェクト(1.8)のコンストラクターが終了したときにのみ有効になります。

于 2012-09-23T10:12:22.067 に答える