四种不同对象的生存方式(栈、堆、全局、局部静态)

四种不同对象的生存方式(栈、堆、全局、局部静态)

//东软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
版权声明:本文为博主原创文章,转载请附上博文链接!

上一篇:谷歌宣布将在移动APP中大量增加广告位


下一篇:WinForm控件开发总结(六)-----控件属性类型转换器代码详解