7

これらが基本的に同じものであるかどうかを知りたいです。

class ExampleClass {
    public:
        ExampleClass(Object& newObj) : obj(newObj) {}
    private:
        Object obj;
}

class ExampleClass2 {
    public:
        ExampleClass2(Object& newObj) : objReference(newObj) {}
    private:
        Object& objReference;
}

では、これはどちらのクラスでも機能しませんか?

ExampleClass* getExampleObject() {
    Object obj;
    return new ExampleClass(obj);
}

ExampleClass2* getExample2Object() {
    Object obj;
    return new ExampleClass2(obj);
}

void main() {
    ExampleClass* ec = getExampleObject();
    ExampleClass2* ec2 = getExample2Object();
    //Do something involving the member objects of ec and ec2
}

では、両方の getExampleObject メソッドの後、メンバー オブジェクトは無効ですか? ExampleClass のコンストラクターは、そのコンストラクターで参照されるオブジェクトのコピーを保存しませんか?

4

2 に答える 2

9

ExampleClassコンストラクター引数で参照されるオブジェクトのコピーを取るため、問題ありません。

ExampleClass2コンストラクター引数で参照されるオブジェクトが、ExampleClass2インスタンスの存続期間中存在する必要があります (オブジェクトへの参照を格納するため、コピーしません)。そうでない場合、ExampleClass2参照先のオブジェクトが破棄されるとすぐに、インスタンスはダングリング参照を持つことになります。これは、リターン時に破棄getExample2Object()される関数の場合です。objgetExample2Object()

于 2012-06-20T10:17:48.780 に答える
1

これらが基本的に同じものかどうか知りたいのですが。

いいえそうではありません。Exampleのコンストラクタはオブジェクト参照を受け取り、渡されたオブジェクトを使用してメンバーオブジェクトを構築します。このオブジェクトは参照ではなく、コピーです。の場合、Example2実際にobjReferenceはctorのパラメーターで渡されたオブジェクトを参照します。newObjあなたは一生の間だけ良いです。

Object obj;
return new ExampleClass2(obj);

失敗する典型的なケースです。関数が戻ると、ぶら下がっている参照があります。

于 2012-06-20T10:19:52.040 に答える