显示生成临时对象:生存周期为它所在语句。
C++编译器优化:用临时对象拷贝构造同类型新对象时,临时对象被优化掉,不产生临时对象,直接构造新对象。
来,先看几个简单的例子,了解临时对象的生存周期。
//①
CGoods goods = CGoods("bbb",90,9.8);//不产生临时对象,调用构造函数初始化goods
//②
goods = CGoods("bbb",90,9.8);//先构造临时对象,再赋值给goods,再析构临时对象
//③
goods = (CGoods)("bbb",90,9.8);//产生临时对象,调用CGoods(double)构造函数,然后赋值,之后析构临时对象
//④
CGoods *p = &CGoods("ccc",80,9.0);//先开辟内存,然后初始化
delete p;//先析构,再释放内存
//⑤
CGoods *p1 = &CGoods("ddd",80,9.0);//产生临时对象,语句结束,析构临时对象,所以指针不能指向临时对象
//⑥
CGoods &p2 = CGoods("ddd",80,9.0);//p2时临时对象的名字,调用构造函数构造p2
下面通过具体的例子,来熟悉。
class Test
{
public:
Test(int a = 5,b = 5):ma(a),mb(b){}
~Test(){}
Test(const Test& src):ma(src.ma),mb(src.mb){}
void operator=(const Test& src)
{
ma = src.ma;
mb = src.mb;
}
private:
int ma;
int mb;
};
Test t1(10,10);//先构造全局变量t1,t5
int main()
{
Test t2(20,20);//构造t2
Test t3 = t2;//用t2拷贝构造t3
static Test t4 = Test(30,30);//不产生临时对象,直接构造t4
t2 = Test(40,40);//显示构造临时对象,赋值给t2,并析构临时对象
t2 = (Test)(50,50);//显示构造临时对象Test(50,50),赋值给t2,析构临时对象
t2 = 60;//隐式构造临时对象Test(60,5),赋值给t2,析构临时对象
Test *p1 = new Test(70,70);//堆上开辟空间,构造对象,p1指向对象
Test *p2 = new Test[2];//构造两次对象,调用构造Test(5,5)
Test *p3 = &Test(80,80);//构造临时对象,p3保存地址,析构临时对象
Test &t4 = Test(90,90);//构造对象p4
delete p1;//析构p1指向的对象(70,70)
delete []p2;//析构对象数组
return 0;
}
Test t5(100,100);
//最终析构顺序p4,t3,t2,t4,t5,t1