c++ - 我们什么时候应该将赋值运算符设为私有(private)而不是实现

标签 c++ assignment-operator

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

给定以下代码:

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

我了解到答案是: A 持有对 U 实例的 C++ 引用,可以复制但不能重置。因此你必须:

• 编写一个复制构造函数,将其 U 初始化为 A 源实例引用的同一实例。

• 将其赋值运算符设为私有(private)且不实现

我知道引用无法重置。但是,这是否意味着只要类包含引用成员数据,我就永远不能使用赋值运算符? 下面的代码有意义吗? 以下代码是我自己写的(不是答案)

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

提前致谢。

最佳答案

不能更改引用以引用其他内容。但是你可以做你在这里做的,因为做:

u_ = a.u_;

实际上改变了引用的值。它会记录更改哪个引用的值。

关于c++ - 我们什么时候应该将赋值运算符设为私有(private)而不是实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5207916/

相关文章:

c++ - 在 C++17 中弃用 `std::result_of` 的原因是什么?

c++ - 编译器为具有引用和常量成员的类生成的复制/赋值函数

c++ - "Almost default"C++ 中的复制构造函数(和赋值运算符)

c++ - 如何找到 C++ 标准库的实现?

c++ - "empty"可变模板特化的地址

c++ - 字符串解析的优雅解决方案

scala - 在 Scala 中,a += b 何时变为 a = a + b?

c++ - QQuickView 窗口在鼠标调整大小时卡住

c++ - 使用 int 成员实现哪些运算符

c - 赋值从指针生成整数