当前位置:C++技术网 > 资讯 > 函数返回引用的深入理解

函数返回引用的深入理解

更新时间:2015-06-26 11:54:25浏览次数:1+次

引用有三种 引用的理解 

 非函数调用时

一、 普通引用

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所在的内存是线程栈依然对线程是有效的,直接存取不会引起违规的。但是如果越过了栈,读写了其他进程的线程栈时,才会出现内存违规。所以,一般不违规,但是用法确是错的。这个一定要注意。