临时对象的生存周期在表达式结束
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);
}
以上程序则变成了三个对象的生成,在形参传送时因为使用了引用所以又少了一个
所以一般自定义类型做形参时都会设为引用,提高效率
对象的生存周期
最新推荐文章于 2021-09-16 18:28:53 发布