#include
using namespace std;
class c
{
public:
c(int m) :b(m) {};
void display()
{
cout << b << endl;
}
private:
int & b;
};
int main()
{
c ca(5);
ca.display();
return 0;
}
不知道为什么,输出了很大的数字
#include
using namespace std;
class c
{
public:
c(int m) :b(m) {};
void display()
{
cout << b << endl;
}
private:
int & b;
};
int main()
{
c ca(5);
ca.display();
return 0;
}
不知道为什么,输出了很大的数字
把类定义里的int& b
改成int b
就可以正确运行了。
使用int&
是有风险的,因为int&
是引用变量,因此它必然需要有一个依托的载体(原变量)。例如int& b = a;
,就是a为原变量,b是a的别名。
问题是:如果在使用b的时候,a已经被销毁了怎么办呢?这就是引用的风险,也是初学者常犯的错误。你的这个程序里面,b引用的是一个临时变量“m=5”,m的作用域仅限于c类的构造函数,构造函数一结束,这个变量的内存就被回收了,所以b指向的位置已经不再是原变量(实际上,原变量m已经不存在了)。再调用ca.display()
访问b,访问到的就是一个不符合预期的数字。