C++ 函数返回引用

如题所述

1.
指的是你返回一个指向局部变量的引用,包括参数。
2.
b是int类型,auto在c++中是一个废弃的关键字,不过在c++11中被重新启用,用来自动推导类型。e是一个引用类型,即可以想象成就是被引用的对象,所以当你取e的地址时,其实获得的是被引用的对象地址。由于你的e引用的是一个局部变量,也就是栈上的变量,因为栈的起始地址一般都会随机变化,所以你会得到不一样的结果。随机变化的原因是为了防止某些类型的攻击,提高程序安全性。
3.
c++中不存在static类型一说,static是用来指示变量的生命周期类型,即静态生命周期。我想你是想说b是static
int。当为static
int时,程序启动时就会将b初始化为40,此时一直持续到程序结束,所以此时返回引用是合法,因为编译器保证,该变量生命周期会持续整个程序运行期间。
e2 = f();这里返回引用,而e2不是引用,所以会进行拷贝初始化,所以e2和f()返回的引用是两个对象。e2为40。
f()=10;这里由于返回引用,而引用指向static
int
b,所以会对b进行修改,于是b变为10。
e2是main的局部变量,e是引用,f()返回值是引用,此时e等价于f()。当取地址时,e2的地址将不会等于e的地址,因为他们是两个对象,两个对象的地址必然不同(除了一个类的子对象)。这里e2是局部变量,所以分配在栈上,而e,f()指向的是静态变量,所以分配在全局内存中。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-06-03
1+2是啊,你说的“链式应用”我觉得有些夸张就是连续运用操作符号,比如你用加法操作符return一个类类型数据,但是你用想使用这个被加后产生的类的成员x,如果你不引用就是a=b+c;a.x,但是如果你引用了就可以(b+c).x,只是因为如果你只是返还一个值,那么它只会在栈区开辟一块数据地址存放零时对象的值,然后把这个临时对象的值用复制构造函数复制给b,但是你却不能用它,但是引用是传地址所以可以用它,有个例子很鲜明能浅显说明这种区别:a=3,如果我用3+1,这里的3就值传递情况下的b+c显然是没有意义;但是我用a+1就是用意义的,a就是3这个地址的引用,你改变它下面的值是用意义的,只能说这么多,有些东西还要自己想;
3,更简单,++a,如果你引用了就是返回了a的地址,此时a已经加1,完全可以,但是如果是a++,你返还的是a加1之前的数值,换句话说此时a已经不是a,而是a+1,但是你如果引用,那么又是它的地址,而地址下是a+1,那么后++就和前++没有任何区别,这样做是没有意义的,能明白吗?
4,你去了当然有用,看你怎么用了,引用不是强迫你用,但是要看你想实现什么功能,举++的例子,你定义函数时必定起传地址,但是如果你返还不传引用而是传值,那么你想(++a)++,有意义吗?很显然没,应为括号里的++a是常量,这就和3+1一样;
5,看了上面的东西,如果你理解了,这个问题就不是问题了,还是地址的问题
相似回答