返回栈上的对象、对象的引用及各构造器发生的时机

#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;
}

 


 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值