对象的生存周期

临时对象的生存周期在表达式结束
class point{}
如果有代码出现》point p=10;
这个过程会出现:
1右操作数10 生成临时对象:point(10=》生成临时对象
2临时对象生成p这个新对象
3表达式结束,临时对象销毁
但是实际上并不会出现这么多操作,会直接进行一个对p对象的构造函数
只是因为存在临时对象优化

优化的前提是:临时对象的生成是为了生成新对象
		      以临时对象的方式来生成新对象


临时对象的分类:
	1.显示生成临时对象:明确指出生成什么样的临时对象
		point p=point(10);
	2.隐式生成临时对象:编译器推演出因该生成什么样的临时对象
		point p=10;

临时量:
	1.内置类型-》常量
	2.自定义类型-》变量
	3.隐式生产的临时量式常量
 	在赋值重载运算符中形参前面加上const的目的是:1.防止形参修改实参的值
						     2.接收隐式生成的临时量


point* pc=&point(10);//如果指针指向一个临时对象,当临时对象销毁时指针的操作都是非法操作
point& rc=point(10);//但是在这里没有问题,引用会提高临时对象的生成周期到和引用变量相同


临时对象
point getpoint(point p)//3
{
  	point tmp=p;//4
   	return tmp;//5
}

int main()
{
 	point p1(1,2);//1
 	point p2;//2
 	p2=getpoint(p1);
}
上面的程序一共会调用五个构造函数,这也涉及了类类型的返回方式
以前的返回方式:1.<=4字节  eax带回
		2.>4字节 && <=8字节 由 eax edx带回
		3.>8字节  由临时量带回
但是这个规则在类类型返回时有所不同。即使对象的大小小于8字节也是调用五个构造函数,都是通过临时对象带回
所以第五个构造时函数结束后返回值生成的临时对象在对p2进行辅助重载操作
如果将其改为:point p2=getpoint(p1);那么只会生成四个对象,返回值生成的临时对象被编译器优化了

point getpoint(point& p)
{
  	point tmp=p;
   	return tmp;
}

int main()
{
 	point p1(1,2);
 	point p2=getpoint(p1);
}
以上程序则变成了三个对象的生成,在形参传送时因为使用了引用所以又少了一个

所以一般自定义类型做形参时都会设为引用,提高效率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值