c++中返回变量值的方式有两种,一种是非引用的方式返回,过程中会产生临时变量,将要返回的值先赋给临时变量,当临时变量完成调用处的赋值操作后,自动销毁。第二种,通过引用的方式直接返回函数的本体,中间不会产生临时变量,加快了程序的运行速度。
通过第一种方式
class person
{
public:
person()
{
cout<<"person的无参构造"<<endl;
}
person(person& a)
{
cout<<"person的拷贝调用"<<endl;
this->m_a=a.m_a;
}
~person()
{
cout<<"person的析构函数"<<endl;
}
int m_a;
};
person C;
person getperson()
{
return C;
}
void test()
{
getperson();
}
int main()
{
test();
system("pause");
}
函数会调用拷贝构造函数
person的无参构造
person的拷贝调用
person的析构函数
修改代码通过引用的方式返回对象 C
person C;
person& getperson()
{
return C;
}
void test()
{
getperson();
}
不会调用拷贝构造函数
person的无参构造
当通过函数返回值当作构造新对象的参数时,只能通过第二种方式,第一种由于返回的并不是对象C的本体,中间变量生存期短,不允许传入拷贝构造函数中起别名
//person getperson() //错误写法
person& getperson()
{
return C;
}
void test()
{
person A(getperson()); //等效于 person A=getperson
}
此时生成 对象A 只调用一次拷贝构造函数
person的无参构造
person的拷贝调用
person的析构函数
第一种方式所产生的临时变量,在执行玩A=getperson()后自动消失,该代码调用两次构造函数,一次默认构造函数,一次拷贝构造函数
person C;
person getperson()
{
return C;
}
void test()
{
person A;
A=getperson();
}
现象如下:
person的无参构造
person的无参构造
person的拷贝调用
person的析构函数
person的析构函数