use*_*743 1 c++ reference copy-constructor
我有一个 A 级,有一个参考成员num。我编写了一个num在初始化列表中初始化的复制构造函数。但结果好像很奇怪,打印出来的值不应该是100吗?a.num我的程序什么时候修改了和的值aa.num?
#include <iostream>
using namespace std;
class A{
public:
int& num;
A(int n):num(n){}
A(const A& obj):num(obj.num){}
void print(){
cout << num << endl;
}
};
int main(){
A a(100);
A aa = a;
a.print(); //Expected to be 100, but it isn't
aa.print(); //Also expected to be 100, but it isn't
//The address of a.num and aa.num are the same, so both of them are referencing to the same place. But the question is why the value isn't 100 but a strange value
cout << &(a.num) << " " << &(aa.num) <<endl;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
-1077613148
-1077613148
0xbfc4ed94 0xbfc4ed94
Run Code Online (Sandbox Code Playgroud)
该问题与复制构造函数无关。在构造函数中A::A(int n),您将成员引用绑定num到构造函数参数n,当退出构造函数时,该参数将被销毁,使引用num悬空。对它的任何取消引用都会导致 UB。
您可以将构造函数更改为获取引用,
A(int& n):num(n){}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
int i = 100;
A a(i);
Run Code Online (Sandbox Code Playgroud)