这是一个旧的考试问题,它要求我们在有意义的时候编写赋值运算符和复制构造函数,析构函数。
给出以下代码:
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;
}
提前致谢。
答案 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成员或引用,编译器将知道不生成赋值运算符。这些不能重新分配。