函数返回值是匿名对象去和留的剖析

#include<iostream>
using namespace std;
class location
{
    public:
        location(int xx=0,int yy=0)
        {
            X=xx;Y=yy;
            cout<<"Constructor Object.\n";
        }
        //copy构造函数,用一个对象完成对另一个对象的初始化 
        location(const location& obj)
        {
            X=obj.X;Y=obj.Y ;
            cout<<"Copy_constructor called"<<endl; 
        }
        ~location()
        {
            cout<<"X:"<<X<<","<<"Y:"<<Y<<"    "<<"Object destoryed,"<<endl;
        }
        int GetX()
        {
            return X;
        }
        int GetY()
        {
            return Y;
        }
        private:
            int X,Y;
};
//g()函数返回一个元素 
//结论1:函数的返回值是一个元素(复杂类型的),返回的是一个新的匿名对象(所以会调用匿名对象类的copy构造函数)
//这样写代码,设计编译器的大牛们 :
//我就给你返回一个新对象(没有名字)
//结论2:有关匿名对象的去和留 
//如果用匿名对象初始化另外一个同类型的对象,那么匿名对象直接就转成有名对象
//如果用匿名对象赋值给另外同类型的对象,那么匿名对象直接被析构 
location g()

    location A(1,2);
    return A;
 } 
 void playobj1()
 {
     g();
  } 
//匿名对象的第一种接法 
void playobj2()
{
    //用匿名对象初始化m,此时C++编译器直接把这个匿名对象转成m(扶正)。从匿名转成有名字了,名字就是m
    // 
    location m=g();//因为提前吧匿名对象的内存搞出来了,所以这次初始化是不会调用copy构造函数。 
    printf("匿名对象被扶正,不会析构掉\n");
    cout<<m.GetX() <<endl; 

//匿名对象的第二种接法 
void platobj3() 
{
     
    location m2(1,2);
    m2=g();
     
    printf("匿名对象被析构\n");//因为用匿名对象=给m2,所以匿名对象被析构 
    cout<<m2.GetX() <<endl; 
 } 
 
int main() 
{
    playobj1();
    playobj2();
    platobj3(); 
    cout<<"hello"<<endl;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值