- インスタンス変数は、デフォルトのコンストラクターを使用して作成できないオブジェクトです。Java コンストラクターでは、より高いレベルのクラス コンストラクターでパラメーターを決定できます。
class A {
public:
A(int n);
}
class B {
public:
B(int n) : a1(n), a2(n+1) {}
private:
A a1, a2;
}
- インスタンス変数は参照型であり、コンストラクターで単純なアルゴリズム (条件、計算など) を実行し、オブジェクトを作成してその参照に割り当てる必要があります。
static int n = 1;
static int m = 2;
class A {
public:
A(bool useN) : ref(useN ? n : m) {}
private:
int &ref;
}
もちろん、(静的) ヘルパー関数でより複雑な計算を非表示にすることができますref(f(parameters))
。これは、初期化子リストに含まれています。
最初にオブジェクトを作成してから参照に割り当てる必要がある場合、そのオブジェクトは主にどこに存在しますか? 結局のところ、参照とは、誰かが他の誰かを指差して「あそこにいるのは私です」と言っているだけです。外部オブジェクトが実際にこのオブジェクトを所有している場合、参照は必要ありません。オブジェクトまたはスマート ポインターのいずれかが必要です。
Java 参照は、おそらく C++11 のstd::shared_ptr
に最も近いものであり、標準ライブラリのスマート ポインターの 1 つであり、日常的な使用に強く推奨されています。この種の設定では、 も検討する必要がありますstd::uniqe_ptr
。これはオーバーヘッドが少し少なくなりますが、制限があります。適切なコピー コンストラクターを作成する必要があるという事実が問題であるかどうかは、好みの問題です。多くの場合、既定のコンストラクターを組み合わせるとshared_ptr
、必要な動作が得られません。
後方互換性のためにのみ言語に含まれている には近づかないでstd::auto_ptr
ください。多くの状況で正しく使用するのは難しいです。