3

これは、代入演算子とコピー コンストラクター、デストラクタを適切な場合に記述することを求める古い試験問題です。

次のコードがあるとします。

class U { /* code not specified here */ };
class A { /* code not specified here */ private: U& u_; };

答えは次のとおりです。A は U のインスタンスへの C++ 参照を保持します。これはコピーできますが、リセットすることはできません。したがって、次のことを行う必要があります。

• その U を、A ソース インスタンスによって参照される同じインスタンスに初期化するコピー コンストラクターを記述します。

• 代入演算子を非公開にし、実装しない

参照をリセットできないことはわかっています。ただし、クラスに参照メンバー データが含まれている場合は常に代入演算子を使用できないということですか? 次のコードは意味がありますか? 以下のコードは自分で書いたものです(答えではありません)

  class U{
    public:
        int u;
    };

    class A{
    public:
        A(U& u):u_(u){}
        A& operator=(const A& a){
            u_ = a.u_;
            return *this;
        }
        U& u_;
    };

    int main(){
        U u1;
        U u2;
        A a1(u1);
        A a2(u2);
        a1 = a2;
        a1.u_.u = 1;
        a2.u_.u = 2;
        cout << "a1.u_.u : " << a1.u_.u << endl;
        cout << "a2.u_.u : " <<  a2.u_.u << endl;
    }

前もって感謝します。

4

5 に答える 5

2
A& operator=(const A& a){
    u_ = a.u_;
    return *this;
}

期待どおりに機能しませんU。への参照ポイントが割り当てられます。
もちろん、クラスに参照が含まれていても、その参照を割り当てることができ(参照されたクラスにoperator=プライベートのみがある場合はどうなりますか?)、参照が割り当てられないconst U&(したがって割り当てることができない)限り、代入演算子を実装できます。

于 2011-03-06T00:58:08.223 に答える
2

他の何かを参照するように参照を変更することはできません。ただし、ここで行うことは、次の理由で実行できます。

u_ = a.u_;

実際には、参照される値が変更されます。参照される値の変更には注意してください。

于 2011-03-06T01:00:06.523 に答える
1

参照はポインタとして見ることができます。唯一の違いは、参照が割り当てられると参照先を変更できないことです。代入演算子では、参照が指す場所を割り当てずに、参照の内容をコピーしています。

コンパイラの場合、次のクラスは同等です。ポインタ バージョンがポインタを逆参照してコンテンツをコピーすることに注意してください。

class A_Ref{
public:
    A_Ref(U& u):u_(u){}
    A_Ref& operator=(const A_Ref& a){
        u_ = a.u_;
        return *this;
    }
    U& u_;
};

class A_Ptr{
public:
    A_Ptr(U* u):u_(u){}
    A_Ptr& operator=(const A_Ptr& a){
        *u_ = *a.u_;
        return *this;
    }
    U* u_;
};
于 2011-03-06T01:13:35.920 に答える
1

クラスに参照メンバーデータが含まれている場合は常に代入演算子を使用できないということですか?

代入演算子を使用できますが、参照を再代入できないため、代入演算子の予想される動作を再定義する必要があります。

于 2011-03-06T01:34:01.713 に答える
0

const メンバーまたは参照がある場合、コンパイラは代入演算子を生成しないことを認識するため、代入演算子をプライベートにする必要さえありません。これらは再割り当てできません。

于 2011-03-06T10:31:41.030 に答える