什么时候我们应该将赋值运算符设为私有而不实现

时间:2011-03-06 00:54:35

标签: c++ assignment-operator

这是一个旧的考试问题,它要求我们在有意义的时候编写赋值运算符和复制构造函数,析构函数。

给出以下代码:

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;
    }

提前致谢。

5 个答案:

答案 0 :(得分:2)

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

无法按预期工作,U参考点将被分配 当然,即使该类包含引用,您也可以实现赋值运算符,只要该引用可以被赋值(如果引用的类只有operator=只有privat?)并且引用不是{{1} }(因此无法分配)。

答案 1 :(得分:2)

无法更改引用以引用其他内容。但是你可以做你在这里做的事情,因为:

u_ = a.u_;

实际上会更改引用的值。它会注意更改引用值。

答案 2 :(得分:1)

引用可以看作是指针。唯一的区别是,一旦分配了参考点,就无法改变参考点的位置。在赋值运算符中,您正在复制引用的内容,而不是指定引用所指向的位置。

对于编译器,以下类是等效的,请注意指针版本derefence指向复制内容的指针:

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_;
};

答案 3 :(得分:1)

  

这是否意味着我永远不会使用   每当班级时赋值算子   包含参考成员数据?

您可以拥有赋值运算符,您无法重新分配引用,因此需要重新定义赋值运算符的预期行为。

答案 4 :(得分:0)

您甚至不必将赋值运算符设置为私有,因为如果存在const成员或引用,编译器将知道不生成赋值运算符。这些不能重新分配。