构造函数、拷贝构造函数,析构函数赋值函数何时使用

一、

class Test
{
public:
    Test(int a=5):ma(a){cout<<"Test(int)"<<this<<endl;}
    ~Test(){cout<<"~Test()"<<this <<endl;}
    Test(const Test &src):ma(src.ma)
    {cout<<"Test(const Test&)"<<this<<endl;}
    void operator=(const Test &src)
    {
        ma = src.ma;
        cout<<"operator="<<endl;
    }
    int GetValue(){return ma;}
private:
    int ma;
};
Test GetTestObject(Test &t)//按引用传递
{
    int value = t.GetValue();
    Test tmp(value);
    return tmp;
}


int main()
{
    Test t1(20);//构造t1
    Test t2;//构造t2
    t2 = GetTestObject(t1);//进入函数构造tmp,拷贝构造tmp的临时对象,析构tmp,赋值构造t2,析构临时对象,析构t2,析构t1
    cout<<t2.GetValue()<<endl;
    return 0;
}

运行结果如下:

二、

class Test
{
public:
    Test(int a=5, int b=5):ma(a), mb(b)
    {cout<<"Test(int, int)"<<this<<this->ma <<endl;}
    ~Test()
    {cout<<"~Test()"<<this<<endl;}
    Test(const Test &src):ma(src.ma), mb(src.mb)
    {cout<<"Test(const Test&)"<<this<<this ->ma <<endl;}
    void operator=(const Test &src)
    {ma = src.ma; mb = src.mb; cout<<"operator="<<this<<this->ma <<endl;}
private:
    int ma;
    int mb;
    };



Test t1(10, 10);//构造t1
int main()
{
    Test t2(20, 20);//构造t2
    Test t3=t2;//拷贝构造t3
    static Test t4 = Test(30, 30);//构造t4
    t2 = Test(40, 40);//构造临时对象,临时对象赋值t2,析构临时对象,
    t2 = (Test)(50, 50);//构造临时对象,临时对象赋值t2,析构临时对象,
    t2 = 60;//隐式构造临时对象,临时对象赋值t2,析构临时对象,
    Test *p1 = new Test(70, 70);//构造临时对象
    Test *p2 = new Test[2];//构造两个临时对象
    Test *p3 = &Test(80, 80);//构造临时对象,析构临时对象
    Test &p4 = Test(90, 90);//构造临时对象
    delete p1;//析构p1指向的临时对象
    delete []p2;//析构两个p2指向的临时对象
}

Test t5(100, 100);//构造t5

/*析构p4指向的临时对象
析构t3
析构t2;
析构t4
析构t5
析构t1*/



三、

class Test
{
public:
    Test(int a=5):ma(a){cout<<"Test(int)"<<this<<endl;}
    ~Test(){cout<<"~Test()"<<this<<endl;}
    Test(const Test &src):ma(src.ma)
    {cout<<"Test(const Test&)"<<this<<endl;}
    void operator=(const Test &src)
    {
        ma = src.ma;
        cout<<"operator="<<&src<<endl;
    }
    int GetValue(){return ma;}
private:
    int ma;
};
Test  GetTestObject(Test t)//先拷贝构造t1的临时对象,因为是按值传递  三
{
    int value = t.GetValue();
    Test tmp(value);//构造tmp   四
    return Test(value);//构造临时对象(假设叫做p1),析构tmp,析构t1的临时对象   五
}
int main()
{
    Test t1(20);//构造t1   一
    Test t2;//构造t2           二
    t2 = GetTestObject(t1);//临时对象(p1)赋值t2,析构临时对象(p1)  六
    cout<<t2.GetValue()<<endl;//析构t2,析构t1   七
    return 0;
}

四、总结:

  • 临时对象构造新对象,系统会自动进行优化。不会产生临时对象,而是直接构造对象。
    转载:

  • 函数的返回值优化,在函数返回时,尽量返回一个临时对象,不要先定义再返回。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值