在学习析构函数时,了解到一般对象的销毁是在main函数内return之后。
在栈上构造的对象要符合栈的先进后出的规则。
堆上new的对象需要遇到delete的时候才能销毁,否则会出现内存泄漏。
所以一般的对象生存周期为定义点开始,return之后main函数退出之前结束。
对于特殊的对象,总结如下:
1、全局对象:全局对象(不论是静态还是非静态)会在编译期间先构造出来(不论它的代码在main上面还是下面)。所以全局对象的生存周期是定义点开始,main函数退出前结束。
2、静态的局部对象:静态局部对象的生命周期是从定义点开始,main函数退出前结束。但是静态局部对象的销毁是在局部对象销毁之后,全局对象销毁之前。
3、生成的临时对象:临时对象的生存周期非常短,在对象生成点开始遇到 ,?; 就结束。
这里有个特殊的:引用会提升临时对象的生存周期,提升到和引用一样的生存周期。
#include<iostream>
using namespace std;
class Cgoods
{
public:
Cgoods(char *mname)
{
name = mname;
cout<<"Cgoods::"<<endl;
}
~Cgoods()
{
cout<<"~Cgoods::"<<name<<endl;
}
private:
char *name;
int amount;
double price;
};
Cgoods good1("good1");
int main()
{
Cgoods good2("good2");
static Cgoods good3("good3");
good2 = Cgoods("good");
Cgoods &good4 = Cgoods("Good");
Cgoods *good5 = new Cgoods("GOOD");
cout<<"---"<<endl;
delete good5;
return 0;
}
static Cgoods good6("Sgood6");
Cgoods good7("good4");
测试结果: