非函数调用时
一、 普通引用
int a;
int&b =a;
这个的意思就是 b是a的别名,两个字母代表是同一个东西;
函数调用时
二、 函数调用,作为参数时
bool function(int &a)
{
a = 1;
}
int value = 0;
function(value);
这 a作为参数不需要占用额外内存资源,而以指针作为参数,需要额外占用一个指针的资源,以结构作为参数,就要额外占用一个结构的资源。详情请看C++入门到精深。
前面两种都是比较容易理解的,而且也不会有多大的异议,第三种作为返回值就有点难理解了。因为它返回的时候不知道和“谁”做别名,也不知道返回的时候函数里的作用域。
三、函数调用,作为返回值
这是普通的返回 |
这是引用的返回 |
Class Home{} |
Class Home{} |
Home function() |
Home& function() |
{ |
{ |
Home h(); |
Home h(); |
Return h; |
Return h; |
} | } |
1.首先我们看一下普通返回的是怎么样的
我们知道,在作用域里面声明的变量,在离开作用域的时候会被释放掉。下图可知,再return的时候str1 和str2都被释放掉了。
就是返回的时候,申请一些临时变量所用的内存资源,然后把要返回的值赋给临时变量,在返回到调用语句的时候,操作临时变量得到相应的你想要的各种信息 (注上图 :D(1833548) =H(1BFA4C) != H(1BFA08))
2.引用的返回
对比上下图,可以看出引用和非引用的最大区别是,没有返回时的临时变量。在返回值为引用的情况下,执行完毕Du()函数,该函数作用域的变量被释放了,那么在函数外面再调用相关的资源、函数都会是错误的。
引用的作返回时候要注意:返回以后对象是否会被释放。这个是重点。
代码下载:点此下载源代码
by dx——评论
确实的,辛苦啦。我也测试了一下,代码如下:
#include <iostream>
using namespace std;
int & test()
{
int a = 10;
cout<<"临时变量的值:"<<a<<endl;
cout<<"临时变量的地址:"<<&a<<endl;
return a;
}
void main()
{
int& b = test();
cout<<"b的地址:"<<&b<<endl;
int i;
cin>>i;
}
说明一下:b就是函数中a的别名,引用的是a。为什么a释放后还可以得到b的值呢?因为主进程的主线程分配到一个线程栈,局部变量都在栈中分配内存空间,函数执行完后,局部变量就释放了,释放只是代表a所指向的内存的值是没有意义的了,可能是对的,因为还没有覆盖,可能是错的,因为其他变量可以覆盖了。所以,虽然释放了,但是a所在的内存是线程栈依然对线程是有效的,直接存取不会引起违规的。但是如果越过了栈,读写了其他进程的线程栈时,才会出现内存违规。所以,一般不违规,但是用法确是错的。这个一定要注意。