博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
返回引用
阅读量:6243 次
发布时间:2019-06-22

本文共 1609 字,大约阅读时间需要 5 分钟。

一直很难理解返回引用:返回哪个对象的引用?返回的引用如何使用?

一、返回值

1. 示例:

int func(parameter_list) {	return a;   	}

2. 解读:此函数返回变量 a 的值时,要产生一个临时变量保存 a 的值,又因为临时变量的生命周期是短暂的,所以该函数的返回结果不能作为左值。

3. 运用:返回值的函数只能作为右值使用,且看下面:

int i = func();		//正确,func()返回的值作为右值使用 func() = 3;			//错误,func()返回的值不能作为左值 int &r = func();	//错误,func()返回的值只是短暂存在的

 

 

二、返回类型是引用类型

1. 示例:

int& func(parameter_list) {	return a;   	}

2. 解读:函数返回变量 a 的引用(即 a 的别名),不产生值的副本,此时只要变量 a 不是局部对象(而是静态局部对象或全局对象),就可以将返回值作为左值。

3. 运用:

//返回值:一个静态/全局对象 func() = 3;			//正确,func()的返回值能返回能作为左值int i = func();		//正确,func()的返回值能作为右值使用  int &r = func();	//正确,func()的返回值可以被引用

4. 返回局部对象的引用:当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。

 

三、加深理解

1. 返回形参的引用

const string& shorterString(const string &s1, const string &s2){	return s1.size() < s2.size() ? s1 : s2;}

解读:由于形参和返回类型都是引用类型,所以在调用该函数以及函数返回结果(返回s1或s2)时,都没有复制这些 string 对象。简单的说,返回的引用是函数的参数s1或s2,而s1和s2同样也是引用(并不是在函数体内产生的,即不是局部对象)。

2. 返回类对象的引用

string& string::operator =(const string &str) {     return *this;    //this指向调用该成员函数的对象}

解读:上面是string类的赋值函数(属于类的成员函数)中,返回的类对象不能是函数内定义的类对象(会释放掉),一般为this指向的对象。

佐证:之所以返回类对象的引用,因为想将返回值作为左值使用,如使用ss = s1 = s2(ss = s1返回左值后继续进行赋值)。

3. 引用返回左值

char& get_val(string &ss, string::size_type index){	return ss[index];}//使用语句调用:	string s("123456");    get_val(s,0)='a';	//作为左值     cout << s << endl;

 

四、回答问题

1. 返回哪个对象的引用

由函数体内的代码可知,返回的是变量 a、变量 s1等,于是又联想到不能返回局部对象的引用,我们可以知道,我们在调用点处使用的就是这些返回的变量a、s1等,只不过可能是它们的别名罢了。

2. 如何使用返回的引用

这么用:函数名(实参) + 其他部分

func() = 3;			//作为左值,等号右边可以是合法的任意类型 	func()[2] = 3;		//返回数组的引用 	cout << func() << endl;	//直接输出值 	cout << func()[2] << endl; //同上

  

 

转载于:https://www.cnblogs.com/xzxl/p/7668094.html

你可能感兴趣的文章
经过几天的推敲学习
查看>>
Python Day30
查看>>
WebRequest对DNS说:没有你我依然可以
查看>>
jvm垃圾收集小记
查看>>
MonthCalendar的mousedown方法选择日期
查看>>
用于pytorch的H5Dataset接口(类比TensorDataset接口)
查看>>
Python-入门第三篇
查看>>
解决Cannot change version of project facet Dynamic Web M
查看>>
mysql备份与恢复
查看>>
hadoop实例sort
查看>>
jstat (JVM统计监测工具)
查看>>
git 免密码push,pull
查看>>
js懒加载
查看>>
计算某时间是年中第几周。
查看>>
【论文阅读】A mixed-scale dense convolutional neural network for image analysis
查看>>
用正则表达式匹配网址URL中最后一个反斜杠/后面的内容
查看>>
Define custom @Required-style annotation in Spring
查看>>
General: Know How to Use InetAddress
查看>>
php 克隆和引用类
查看>>
Linux编程之变量
查看>>