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对象的生命周期。
总结:
如果生成的匿名对象在外部有对象等待被其实例化,此匿名对象的生命周期就变成了外部对象的生命周期;如果生成的匿名对象在外面没有对象等待被其实例化,此匿名对象将会生成之后,立马被析构。