// Test_VC6Dlg.h : header file
class AClass
{
public:
AClass(const char* obj) {
sprintf(p,"%s",obj);
TRACE(p);
TRACE(" : Constructor/n");
};
~AClass() {
TRACE(p);
TRACE(" : Destructor/n");
};
private:
char p[20];
};
// CTest_VC6Dlg dialog
class CTest_VC6Dlg : public CDialog
{
virtual BOOL OnInitDialog();
private:
static AClass a1; //静态成员类对象
};
// Test_VC6Dlg.cpp : implementation file
AClass a4("a4"); //全局类对象
AClass CTest_VC6Dlg::a1("a1"); //静态成员类对象(必须初始化)
static AClass a2("a2"); //静态全局类对象
void test()
{
static AClass a5("a5"); //静态局部类对象
}
BOOL CTest_VC6Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
static AClass a3("a3"); //静态局部类对象
test();
test();
return TRUE;
}
程序执行结果:
构造
a4 : Constructor //main之前执行构造
a1 : Constructor //main之前执行构造
a2 : Constructor //main之前执行构造
a3 : Constructor //运行到CTest_VC6Dlg::OnInitDialog()时执行构造
a5 : Constructor //运行到CTest_VC6Dlg::OnInitDialog()时执行构造,而且只执行一次构造,即使运行了两次test();
析构(和构造的顺序相反)
a5 : Destructor
a3 : Destructor
a2 : Destructor
a1 : Destructor
a4 : Destructor
说明:a4、a1、a2的执行顺序是由代码的先后顺序决定的。如果
// Test_VC6Dlg.cpp : implementation file
AClass CTest_VC6Dlg::a1("a1"); //静态成员类对象(必须初始化)
static AClass a2("a2"); //静态全局类对象
AClass a4("a4"); //全局类对象
那么构造顺序为
a1 : Constructor //main之前执行构造
a2 : Constructor //main之前执行构造
a4 : Constructor //main之前执行构造