注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

随机过程

http://superware.blog.163.com

 
 
 

日志

 
 

返回引用的函数  

2014-07-07 21:17:07|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、返回引用


        由于引用是变量的实际地址,因此如果函数返回引用,那么被返回的是变量本身的地址。由于访问变量的机制是直接寻址方式,因此可以通过被返回的变量本身的地址,直接访问该变量本身。也就是说可以通过对函数赋值的方式来给函数所返回的变量赋值。所以,如果函数返回引用,这个引用必定是一个实际变量(或者说实际变量的地址)。如下例:

#include <iostream>

using namespace std;

int &get (int *array, int i)
{
cout << "&array[i] = " << &array[i] << endl; // array[i] 的地址
cout << "array[i] = " << array[i] << endl; // array[i] 的值
return array[i]; // 返回 array[i] 本身,

// 也就是形参,同时也是实参
}

int main ()
{
int ia[10];

for (int i = 0; i < 10; i ++)
{
cout << "&ia[i] = " << &ia[i] << endl;
}


for (int i = 0; i < 10; i ++)
{
ia[i] = i;
}

for (int i = 0; i < 10; i ++)
{
get (ia, i); // 将 ia[i] 返回。可以作为左值,也可以作为右值。
}
}


二、函数作为左值

        如果返回的引用不是const,那么表明返回值是可以更改的,这就表明函数成为可以重新赋值的左值,如下例子:

#include <iostream>


using namespace std;


int &get_value_int (int &a)

{

a = 2;

cout << "a = " << a << endl;

return a;

}


int main ()

{

int a = 5;

cout << "get_value_int (a) = " << get_value_int (a) << endl;

get_value_int (a) = 10;

cout << "get_value_int (a) = " << get_value_int (a) << endl;

}

结果:

a = 2;

get_value_int (a) = 5;

get_value_int (a) = 10;


三、返回 const 引用(函数不为左值)

#include <iostream>


using namespace std;


int &get_val_int (int &a)

{

a = 2;

cout << "a = " << a << endl;

return a;

}


int main ()

{

int a = 5;

cout << "get_val_int (a) = " << get_val_int (a) << endl;

get_val_int (a) = 10; // error, get_val_int(a) is const

}

g++ 编译结果:

func.cc: In function ‘void try_func()’:
func.cc:19:21: error: assignment of read-only location ‘get_val_int((* & a))’

clang++ 编译结果:

func.cc:19:19: error: read-only variable is not assignable
get_val_int (a) = 10;
~~~~~~~~~~~~~~~ ^
1 error generated.

从上面 g++ 和 clang++ 编译结果可以看出,clang++ 编译结果的错误提示更直观。

四、函数 const 引用形参

        函数形参声明为 const 引用,表示该形参所指示的实参不可更改,这样的形参作为函数的返回值,返回值一定是 const 引用,不可是非 const 引用。

#include <iostream>


using namespace std;


cosnt int &get_val_int (const int &a)

{

a = 2; // error, a can't be changed

cout << "a = " << a << endl;

return a;

}


int main ()

{

int a = 5;

cout << "get_val_int (a) = " << get_val_int (a) << endl;

get_val_int (a) = 10; // error, get_val_int(a) is const

}

g++ 编译结果:

func.cc: In function ‘const int& get_val_int(const int&)’:
func.cc:8:7: error: assignment of read-only reference ‘a’
func.cc: In function ‘void try_func()’:
func.cc:19:21: error: assignment of read-only location ‘get_val_int((*(const int*)(& a)))’

clang++ 编译结果:

func.cc:8:5: error: read-only variable is not assignable
a = 2;
~ ^
func.cc:19:19: error: read-only variable is not assignable
get_val_int (a) = 10;
~~~~~~~~~~~~~~~ ^
2 errors generated.

  评论这张
 
阅读(97)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017