为什么80%的码农都做不了架构师?>>>
用引用作为返回值的情况(返回值作为左值):
函数形参为引用,函数要返回形参时,要用引用
类成员函数要返回自身时,要用引用
返回全局变量,可以用引用
不能用引用作为返回值的情况(返回值只作为右值):
返回局部变量时
eg:
用引用作为返回值:
1. friend istream& operator >> (istream & in,A& a);
2. A& operator ++ () { ++(this->ele); return *this; }//前缀++重载 A& operator = (const A& a) { this->ele = a.ele; return *this; } //赋值运算符重载
不能用引用作为返回值:
A operator ++ (int) { A tmp=*this; ++(*this); return tmp; }
再说一下引用作为返回值与值返回的区别:
引用作为返回值:返回的是地址
值返回:编译器额外定义一个临时变量,以返回的值初始化,然后此临时变量被其他变量或表达式访问
在这里可能有人要问了为什么不能返回局部变量的引用,因为函数在返回之后局部变量都释放了,如果返回引用会访问到未定义区域。请看下面
函数返回时的过程是这样的:
函数计算完毕,执行到return语句时,会在内存中自动定义一个返回值类型的临时变量以return的值初始化,之后函数执行完毕,局部变量释放,注意此时临时变量还存在!然后用户根据需要访问或者不访问临时变量,等到执行下一条语句,临时变量自动销毁。
以下是例证:
vs2010
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"无参构造函数"<<endl;
}
A(const A& a)
{
cout<<"拷贝构造函数"<<endl;
}
A& operator = (const A& a)
{
cout<<"赋值运算符重载"<<endl;
return *this;
}
~A()
{
cout<<"析构函数"<<endl;
}
private:
};
const A boo(const A a)
{
cout<<"A tmp = a"<<endl;
A tmp = a;//调用拷贝构造函数
cout<<"return tmp"<<endl;
return tmp;//外部会自动定义一个临时变量,以tmp初始化,所以调用拷贝构造函数
}
int main(int argc,char* argv[])
{
cout<<"A a"<<endl;
A a;//调用无参构造函数
cout<<"A b(a)"<<endl;
A b(a);//调用拷贝构造函数
cout<<"-----------------------------------------------"<<endl;
b=boo(a);//当把a值传递给形参时,会调用拷贝构造函数;返回时,会定义临时变量以函数内返回值初始化
system("pause");
return 0;
}
执行结果:
A a
无参构造函数
A b(a)
拷贝构造函数
-----------------------------------------------
拷贝构造函数 //定义形参以实参初始化
A tmp = a
拷贝构造函数 //定义tmp以a初始化
return tmp
拷贝构造函数 //定义临时变量以返回值初始化
析构函数 //局部变量tmp析构
析构函数 //形参a析构
赋值运算符重载 //b=临时变量
析构函数 //临时变量析构销毁
请按任意键继续. . .