C++有匿名对象,只在当行代码有用,离开当行代码立即析构!!!

什么是匿名对象?

匿名对象可以理解为是一个临时对象,一般系统自动生成的,如你的函数返回一个对象,这个对象在返回时会生成一个临时对象。

匿名对象的生命周期(很重要!!!)

例一:

class A
{

public:
    A(int s)
    {
        i = s;
    }

    void myshow()
    {
          cout<<i<<endl;
    }
private:

     int i;

};

void playstage()
{
     cout<<A(10).myshow()<<endl;//调用匿名对象

   A a = 11;//此处发生隐身转换。。。。相当于  A a = A(11);   此处的A(11)就是一个匿名对象

     A b = A(12);//当匿名对象有等待初始化的对象接的时候,只调用一次构造和析构函数
     
     A c;//调用一次构造函数
     c = A(13);//此处为赋值。。。。。此处的匿名对象会调用一次构造函数
}

void main()
{
    playstage();

    system("pause");

}

输出:

 

例二:

class Cat
{
public:
    Cat()
    {
        cout<<"Cat类 无参构造函数"<<endl;
    }

    Cat(Cat& obj)
    {
        cout<<"Cat类 拷贝构造函数"<<endl;
    }

    ~Cat()
    {
        cout<<"Cat类 析构函数 "<<endl;
    }

};

void playStage() //一个舞台,展示对象的生命周期
{
    Cat();             /*在执行此代码时,利用无参构造函数生成了一个匿名Cat类对象;执行完此行代码,
                            因为外部没有接此匿名对象的变量,此匿名又被析构了*/
    Cat cc = Cat();    /*在执行此代码时,利用无参构造函数生成了一个匿名Cat类对象;然后将此匿名变 成了cc这个实例对象*/
    
}

int main()
{
    playStage();
    system("pause");
    return 0;
}

输出:

Cat类 无参构造函数
Cat类 析构函数
Cat类 无参构造函数
Cat类 析构函数

说明:

1、在执行playStage( )函数中的Cat( )时,生成了一个匿名对象,执行完Cat( )代码后,此匿名对象就此消失。这就是匿名对象的生命周期。

2、在执行playStage( )函数中Cat cc = Cat();时,首先生成了一个匿名对象,因为外部有cc对象在等待被实例化,然后将此匿名对象变为了cc对象,其生命周期就变成了cc对象的生命周期。

 

总结:

如果生成的匿名对象在外部有对象等待被其实例化,此匿名对象的生命周期就变成了外部对象的生命周期;如果生成的匿名对象在外面没有对象等待被其实例化,此匿名对象将会生成之后,立马被析构。