簡単な答え:Jesse氏は、値のメンバーまたはポインタを使用することをお勧めしますが、この具体例では参照しないことをお勧めします。
長い答え:C++のメモリモデルは、CのほうがJavaのようなものです。オブジェクトは存在する可能性があります。
- がスタックにあります。これは、パラメータとローカル変数の場合です。
- ヒープ上。これは、
new
で作成されたすべてのオブジェクトの場合です。データセグメント内の
- 。これらはグローバル変数です。
- 他のオブジェクトの内部に値のメンバーとして存在します。
これとは対照的に、Javaではプリミティブ型とポインタ(Javaでは参照と呼ばれます)を除き、すべてのオブジェクトはnew
で作成され、スタック上に存在します。この単純なメモリモデルは、不要なオブジェクトを自動的に破棄するガベージコレクタを備えているため、Javaで十分です。
標準C++にはガベージコレクタがありません。オブジェクトは、次のような状況に削除されます。
- 「それはスコープの外に出た」ときスタックベースのオブジェクトが削除され、
- アプリケーションが終了したときにグローバルオブジェクトが削除され、
- に含まれるオブジェクト含まれているオブジェクトが削除されたときに他のオブジェクトが削除されますが、
delete
を使用して、ヒープ上のオブジェクトを手動で削除する必要があります(
- )。
この手動メモリ管理ではエラーが発生する可能性が高いため、通常はC++アプリケーションのオブジェクト間で強力な所有権ポリシーを定義します。
ご質問にお答えいただくには、FooBar
-オブジェクトが存在する限り、member_
にアクセスできるようにしてください。したがってmember_
がFooBar
のオブジェクトのようなものでない場合、オブジェクトが存在するかぎり存在することが保証されている密接に関連したオブジェクトと同様の方法で類似する方法では、おそらく参照を使用したくないでしょう。私はそうmember_
、
ポインタを含むFooBar
を考えるならば、あなたの例では 、私は
なお、ポインタを使用する実装を使用するように変更しても問題ありません。 – Extrakun