类和对象的生存周期

  显示生成临时对象:生存周期为它所在语句。

 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值