c++ operator= const 引用的方法

标签 c++

我正在用这样的 const 引用编写类:

class B;

class foo {
  const B& b;

  foo(const B& newb): b(newb) { }

  void operator=(const foo & foo2) {
      // This does not work
      foo.b = foo2.b;
  }   
};

我正在尝试定义一个有效的运算符 = 显然 = 不起作用,因为不允许我更改 const 引用。这有办法让引用指向另一个对象吗?

如果 b 不是 const,C++ 将为我提供一个有效的 operator=。如果我将一个成员定义为 const cl 将吐出:

警告 C4512:“foo”:无法生成赋值运算符

最佳答案

您要查找的术语是“重新绑定(bind)”。如“是否可以重新绑定(bind)引用?”答案是“不,引用被定义为不可重新绑定(bind)”。但是您可以使用指针并更改它指向的内容:

class B;

class foo {
    B* b;

    foo(const B& newb)
    {
        b = &newb;
    }

    void operator=(const foo& foo2)
    {
        b = &foo2.b;
    }   
};

但是,如果被赋值的对象比用于赋值的对象存在时间更长(顺便说一句,构造函数也有同样的问题),这就有悬空指针的风险。您很有可能根本不需要引用或指针:

class B;

class foo {
    B b;

    foo(const B& newb): b(newb) { }

    void operator=(const foo& foo2)
    {
        b = foo2.b;
    }   
};

如果您确实需要指针/引用(也许 B 是一个基类),那么您将需要研究智能指针来处理对象生命周期问题。

关于c++ operator= const 引用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3408804/

相关文章:

c++ - 使用系统调用处理退出状态

c++ - 用于分组和管理许多不同的内存中索引的解决方案

c++ - 为什么 std::istream::read 不根据读取的字节移动文件指针

c++ - macOS 上的 Qt 组合框样式表

c++ - 编译时出现错误 "fopen' : This function or variable may be unsafe.

c++ - 类定义-两个文件

C++ 析构函数运行两次

c++ - 在 Visual Studio 中执行单个 Boost Test 单元测试

C++ 程序在执行 std::string 分配时总是崩溃

c++ - 如何正确调用getopt函数