const ref与const指针作为operator =重载的数据成员

时间:2019-06-02 14:56:07

标签: c++

具有'const int&'数据成员的类在重载operator =(编译器为g ++)时会导致以下编译错误:

分配只读位置。

当数据成员更改为'const int *'时,就可以了。

为什么?

#include <iostream>

using namespace std;
class B {
 private:
  const int& ir;
  //const int* ir;

 public:
  B(const int& i) : ir(i) {}
  //B(const int& i) : ir(&i) {}
  B& operator=(B& b) { ir = b.ir; return *this; }
};

g ++错误消息:

opertostack.cpp:9:31: error: assignment of read-only location ‘((B*)this)->       B::ir’
        B& operator=(B& b) { ir = b.ir; return *this; }
                               ^~

1 个答案:

答案 0 :(得分:0)

您无法重新绑定参考。创建它们后,他们需要在整个生命周期中都引用相同的对象。

但是,您的代码存在更大的问题。让我们删除operator=()使其编译。然后,我们实例化一个B

B b(42);

b.ir绑定到传递给构造函数的临时int上。构造函数返回后,该临时变量不再存在。 b.ir现在是一个悬空引用。它指的是一个不再存在的对象。

指针也无济于事。如果我们将B::ir更改为const int*并切换注释掉的代码,则如上所述实例化B的结果现在是一个悬空指针。它指向一个不再存在的临时对象。

因此,在两种情况下,使用B::ir时都会出现不确定的行为。

您想要的只是普通的int成员。在这种情况下,构造函数参数也不必是引用。 int与引用一样容易复制,因此使用引用参数不会获得任何好处。最后,赋值运算符应采用const引用,以便您也可以从const B个对象进行赋值:

class B {
private:
    int ir;

public:
    B(const int& i) : ir(i) {}
    B& operator=(const B& b) { ir = b.ir; return *this; }
};