为什么在创建第二个对象后更改了第一个对象成员

时间:2016-05-07 21:50:21

标签: c++ reference

定义了一个以成员作为引用类型的类:

struct NodeBase{
int& val;
NodeBase(int input = 0) :val{ input }{}
};

然后创建了这个类类型的两个对象:

int value1 = 1, value2 = 2;
NodeBase first(value1);
NodeBase second(value2);

创建first后,其成员val等于1.但是,在创建second后,valfirst的值更改为2不知道为什么会这样。

3 个答案:

答案 0 :(得分:2)

引用绑定到函数参数input,当构造函数完成时,该参数超出范围。这使引用悬空。

将参考作为参数,而不是让引用引用外部对象。

NodeBase(int& input) :val{ input }{}

如果您不希望该类引用外部变量,请在不带引用的情况下使该成员成为普通int。假设您尝试使用对于非const引用案例没有意义的默认参数,这可能是您应该做的。

答案 1 :(得分:0)

您还需要通过引用传递输入:

struct NodeBase{
    int& val;
    NodeBase(int& input) :val{ input }{}
};

如果你没有,val将引用本地参数,一旦构造函数完成,它就不再存在。所以它是未定义的行为。

请注意,您无法提供默认参数=0,这在保留参考时没有意义。

答案 2 :(得分:0)

您将value1作为存储在input中的副本传递。然后保存对input变量的引用。不是value1。因此,当构造函数终止时,您将引用die。并成为一个悬垂的参考。

试试这个:

struct NodeBase{
  int& val;
  NodeBase(int& input) :val{ input }{}
};