返回引用
Posted GGBeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回引用相关的知识,希望对你有一定的参考价值。
一直很难理解返回引用:返回哪个对象的引用?返回的引用如何使用?
一、返回值
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; //同上
以上是关于返回引用的主要内容,如果未能解决你的问题,请参考以下文章