例题1:
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++程序的生与死:兼谈构造函数与析构函数部分的示例很能说明问题。
题目2
#include <iostream>
using namespace std;
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();
system("pause");
return 0;
}//15析构localObjectInMain //16析构staticObject //17析构GlobalObject