C++ 函数返回引用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()指向的是静态变量,所以分配在全局内存中。 参考技术A 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,看了上面的东西,如果你理解了,这个问题就不是问题了,还是地址的问题
c++中为啥要函数返回引用?
参考技术A 1c++标准中没有所谓的“c++为什么返回引用的函数的形参也必须是传引用”的规定。
2
在你的例子里(很奇怪的用法,为什么不直接
cp1
=
cp2;呢),不能去掉"&"的原因如下:
如果没了参数的"&",那么这个returnme函数所做的事情就是将cp1复制给临时对象a,
然后返回a的引用,之后相当于a
=
cp2;
再之后过了这一行,a
的生命周期完结了。
而cp1本身自然不受影响。
ps:
如果你对“生命周期”或者
返回局部对象的引用
这些概念不熟悉的话,请参阅
effective
c++(这本薄书看明白了,那baidu
c++
区的绝大多数问题都难不住你了) 参考技术B 1 返回变量的引用实际上相当返回变量的地址,通常是四个字节,如变量多于4个字节时,返回引用比返回值效率要快.
2 别外,返回引用另一个用处是外界可以使用这个引用改变原变量的内容,而值返回则不能修改内容.
const引用是要使用1中的效率,而防止2中外界修改这个变量的内容
以上是关于C++ 函数返回引用的主要内容,如果未能解决你的问题,请参考以下文章