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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言之隐蔽问题[01 参数传递时参数列表初始化顺序]
问题描述    在如test(int x,int y,int z)的函数中,有多个参数组成的参数列表,那么在进行值的传递时,究竟是按照x->y->z的顺序还是按照其他顺序来进行参数的初始化(或对形参的赋值)呢? 问题验证    为了解决这个问题,使用同一个变量的自身变化来进行观察。比如 int x;传入 x,x++,x++,即可。
一个新手学习python的过程中遇到的一些问题及解决方法
ubuntu12.04中,调用show()函数,没有显示图片。 解决办法:在终端安装一个ImageMagic。 sudo apt-get install imagemagick
C++11初始化列表与参数列表的作用
最近遇到了一个程序,一开始有些莫名其妙,最后经过思考、猜想、验证的过程,将其总结如下: 首先先上代码: 函数声明如下: class Controller { using AnalysisManager = NST::analysis::AnalysisManager; using FiltrationManager = NST::filtration::Filtratio
可视化数据结构和算法(强烈推荐给初学者)
我以前学数据结构和算法时,有些内容感觉很难懂,自己花了很多时间琢磨,最后才搞清楚。数据结构和算法用语言描述的话,比较抽象,而且细节无法描述得太具体清楚。会让人疑问,到底具体怎么操作。用伪代码/代码描述,过程是清晰了,但是又不好懂,时常一行关键代码会让你想得焦头烂额。比较好的办法,就是举个例子,实际演示一遍,这样对整个算法有一个大概的认识后,帮助进一步理解。 但对于新手来说,按照伪代码自己动手演示,难度颇大。好在国外有好事之徒做好了演示动画,相当适合初学者学习,强烈推荐!http://www.cs.usfca
关于初始化参数列表使用注意
1.初始化列表的格式只能呢个用于构造函数 2.非晶态const数据成员必须用参数化列表进行初始化 3.引用格式数据成员初始化必须用参数化列表进行初始化
面试官最常提问的30个问题
我们为什么要雇请你呢? 有的面试只有这么一个问题。话虽简单,可是难度颇高。主要是测试你的沉静与自信。给一个简短、有礼貌的回答:"我能做好我要做得事情,我相信自己,我想得到这份工作"。根据自己的实际情况,好好想想把,看怎么说才具有最高说服力。 你认为自己最大的弱点是什么? 绝对不要自作聪明的回答"我最大的缺点是过于追求完美",有的人以为这样回答会显得自己比较出色,但事实
默认参数与初始化列表补充
针对前天默认参数与初始化列表机制的一些深究 const类型和引用类型,在创建时,必须进行初始化。就是用参数列表初始化,移到构造函数体内部,则无法通过编译。也就是说,一旦进入构造函数体,初始化就已经完成了。那么其他内置类型或者自定义类型是不是这样的呢 #include using namespace std; class CExample { public: int a; f
C++参数初始化列表
#include using namespace std; int get_random() { cout << __FUNCTION__ << endl; return 123; } class Component { public: Component(); void print(); private: int mValue = 0; }; Component::Comp
构造函数 参数初始化列表
构造函数
《学会提问》之一——学会提出好问题
批判性思维主要有以下几个方面 有一套相互关联、环环相扣的关键问题意识恰如其分地提出和回答关键问题的能力积极主动地利用关键问题的强烈愿望 两种思维方式 海绵式思维——强调单纯的获取知识淘金式思维——强调在获取知识的过程中与知识展开互动 弱势批判性思维是利用批判性思维捍卫自己现有的立场和看法。强调批判性思维是利用批判性思维来评估所有的断言和看法,尤其是自