返回引用

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; //同上

  

 

以上是关于返回引用的主要内容,如果未能解决你的问题,请参考以下文章

从对话框片段返回后,工具栏视图引用变为null

返回C ++引用变量的做法是邪恶的吗?

本周小贴士#101:返回值,引用和生命周期

Android App 在片段中创建 ListView 引用时关闭

引用向量的部分片段?

片段对话框对活动的松散引用