2 yeflin yeflin 于 2016.03.13 11:02 提问

初学者提问:c++ 参数列表初始化问题
c++

#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;
}
不知道为什么,输出了很大的数字

2个回答

cxsmarkchan
cxsmarkchan   2016.03.13 11:22
已采纳

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

cxsmarkchan
cxsmarkchan 回复Ths_ye: ^_^
接近 2 年之前 回复
yeflin
yeflin 好的,非常感谢,我好像明白了。
接近 2 年之前 回复
cxsmarkchan
cxsmarkchan 回复Ths_ye: 不同的编译环境下,你会得到不同的结果,这是因为你的这个程序,在C++标准里面属于未定义行为,不同的编译器就可以自由地去处理。
接近 2 年之前 回复
cxsmarkchan
cxsmarkchan 回复Ths_ye: 所谓的正确输出,其实是碰巧的正确输出。也就是原变量m虽然不存在了,但是它还没有被覆盖,仅此而已。
接近 2 年之前 回复
yeflin
yeflin 可是,老师教的引用型变量是这样初始化的,而且在这里正确输出了http://codepad.org/Ns5Fs4F2而在VC6.0 和vs2015 上输出都是很大的数字
接近 2 年之前 回复
apprentices
apprentices   2016.03.13 11:19

你私有数据中&b 是取地址的意思 ,所以说实际输出的是b=5的b的地址,而不是5;

apprentices
apprentices 回复cxsmarkchan: 好的,谢谢的确是我解释的有问题
接近 2 年之前 回复
cxsmarkchan
cxsmarkchan 这个说法不太正确,int& b不是取地址,而是引用变量。&b不是一个整体,int&是一个整体。另外,从函数堆栈的角度严格去分析,输出的也不是5的地址。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!