#include "stdafx.h"
#include <iostream>
using namespace std;
#if 0
栈上的对象是可以返回的 但不能返回栈上的引用(除非返回对象自身的引用)
也就是自己调用一个函数 不能返回其他的引用 只能返回自己的引用
因为其他会在函数结束后释放而自己并没有释放
----返回对象
A func()
{
A a;
return a;
}
此处返回的其实并不是 A a : 中的a,这里的a在函数结束时空间就已经
释放了。做不到返回,返回的其实是a的拷贝,放入一个临时变量中,
返回的空间是在栈上新开辟的,不会随着func()的结束而释放。
----返回引用
A & func()
{
A a;
return a;
}
这时返回的是a的引用,此时没有发生拷贝构造,函数结束a空间被释放
所以它的引用也会被释放 所以 此时返回它的引用毫无意义
----拷贝构造发生的时机
1.构造新对象 A a; A b=a;
2.传参为对象或返回对象
3.拷贝构造发生时 是将拷贝后的内容放入一个新开辟的
临时变量中(匿名空间) 而被拷贝的对象会释放
例如当 return 一个对象时 返回的是新开辟的临时变量
----传引用的优点
对于普通变量来说,传引用效果不明显
对于类对象而言,传对象的引用效率很高,传引用和返回引用不会
发生拷贝构造
传引用等价于,扩大了原对象的作用域
void func(A a)
{
//传对象发生一次拷贝构造
}
void func(A &a)
{
//传对象的引用不发生拷贝构造
}
#endif
class A
{
public:
A()
{
cout << this <<" "<< "constructor" << endl;
}
~A()
{
cout << this <<" "<< "destructor" << endl;
}
A(const A & another)
{
cout <<this<<" "<< "cpy constructor from"<< &another<< endl;
}
A & operator=(const A &another)
{
cout << this <<" "<< "operator= " <<" "<< &another << endl;
return *this;
}
};
A & func()
{
A a; //一次构造器constructor
return a;
}
A & foo(A& a)
{
return a; //参数与返回都为引用不发生拷贝构造
}
int _tmain(int argc, _TCHAR* argv[])
{
A x; //一次构造器constructor
x = func(); //一次赋值运算符重载operator=
A x1; //一次构造器constructor
x1 = foo(x1); //一次赋值运算符重载operator=
return 0;
}
返回栈上的对象、对象的引用及各构造器发生的时机
最新推荐文章于 2022-03-13 13:58:27 发布