四种不同对象的生存方式(栈、堆、全局、局部静态)
//东软2012-11月笔试题
class Sample
{
int x;
public:
Sample(int a)
{
x = a;
cout << "constructing object: x =" << x << endl;
}
};
void func(int n)
{
static Sample obj(n);
}
int main()
{
func(1);
func(10); //1
return 0;
}
[分析]:题目的考查点,静态对象的创建及执行。类中的静态对象只会执行一次,这是输出上面结果的原因。
[扩展分析]:此种静态对象的题目之前在360面试的时候被问到过,后来在《深入浅出MFC》基础部分讲解C++重要性质之——C++程序的生与死:兼谈构造函数与析构函数部分的示例很能说明问题。
笔者对示例稍稍做了扩充,如下:
class CDemo
{
public:
CDemo(const char* str);
~CDemo();
void showObjectName(); //显示对象名。
private:
char name[20];
};
CDemo::CDemo(const char* str)
{
strncpy_s(name,str,20);
cout << "Constructor called for " << name << "\n";
}
CDemo::~CDemo()
{
cout << "Destructor called for " << name << "\n";
};
void func()
{
CDemo LocalObjectInFunc("LocalObjectInFunc"); //5 //10
static CDemo staticObject("StaticObject"); //6
CDemo* pHeapObjectInFunc = new CDemo("HeapObjectInFunc"); //7 //11
cout << "Inside func" << endl; //8 //12
} //9析构LocalObjectInFunc //13析构LocalObjectInFunc
void CDemo::showObjectName() //显示对象名
{
cout << name << "\n";
}
CDemo GlobalObject("GlobalObject"); //1
int main()
{
CDemo localObjectInMain("LocalObjectInMain"); //2
CDemo* pHeapObjectInMain = new CDemo("HeapObjectInMain"); //3
cout << "In main, before calling func\n\n\n"; //4
func();
cout << "\n\n"; //13'
func(); //staticObject静态对象已经存在,不再创建!
cout << "\n\nIn main, after calling func\n"; //14
//test作用域
//staticObject.showObjectName(); //error C2065: “staticObject”: 未声明的标识符
//cout << "In main, after GlobalObject.showObjectName(): ";
//GlobalObject.showObjectName();
return 0;
}//15析构localObjectInMain //16析构staticObject //17析构GlobalObject
执行结果如下:
[结果分析,引申出四种对象]:
生存方式 | 执行时机 | 消亡时机 | |
---|---|---|---|
全局(静态)对象 | 全局静态存储区 global | 比程序进入点更早,构造函数先被执行; | 程序结束前,其析构函数被执行。 |
局部静态对象 | 局部静态存储区 local static | 在对象诞生时,其构造函数被执行。(注意,此处只会有一个实例产生,而且固定在内存上(非stack也非heap),它的构造函数在控制权第一次移转到其声明处时被调用。 | 程序将结束时(此对象因而将遭致毁灭)其析构函数才被执行,但比全局对象的析构函数更早一步执行。 |
局部对象 | 栈区 stack | 在对象诞生时,其构造函数被执行。(同局部静态对象) | 程序流程将离开该对象的存活范围时(以至于该对象将销毁)时,其析构函数被执行。 |
new方式产生的局部对象 | 堆区 heap | 当对象诞生时,其构造函数被执行。(同局部静态对象、局部对象) | 在对象被delete时执行析构函数。(注意,不加delete该heap区空间不会自动释放的,如果程序长期运行,会“吃掉”很多内存,造成结果不可预知。) |
[静态对象的深入探究(全局、局部)]
作者:铭毅天下
来源:CSDN
原文:https://blog.csdn.net/laoyang360/article/details/8185172
版权声明:本文为博主原创文章,转载请附上博文链接!