构造函数能默认初始化其静态成员么?

引子:我们知道,在调用构造函数时,构造函数会自动初始化其非静态成员,如:

class NotStaticMember
{
public:
	NotStaticMember(){ cout << "NotStaticMember() is called" << endl; }
	~NotStaticMember(){ cout << "~NotStaticMember() is called" << endl; }
};

class CanIniNotStaticMember
{
public:
	CanIniNotStaticMember() = default;
	~CanIniNotStaticMember() = default;
private:
	NotStaticMember nsm;
};

int main()
{
	CanIniNotStaticMember cinsm;
}

  

结果:

 

 

探索:那么构造函数能默认初始化其静态成员么?做个实验便知:

 

case1:不在函数外部定义 nsm,在main函数里也不定义StaticMember的实例

class StaticMember
{
public:
	StaticMember(){ cout << "StaticMember() is called" << endl; }
	~StaticMember(){ cout << "~StaticMember() is called" << endl; }
};

class CanIniStaticMember
{
public:
	CanIniStaticMember() = default;
	~CanIniStaticMember() = default;
private:
	static StaticMember sm;
};

int main()
{
    
}

  

结果:

 

 结论:在程序编译期间并不会自动初始化类中的静态成员。

 

case2:不在函数外部定义 nsm,在main函数里定义StaticMember的实例

int main()
{
	CanIniStaticMember cism;
}

  

结果:

 

 结论:构造函数不会自动初始化静态成员。

 

case3:在函数外部定义 sm,在main函数里不定义CanIniStaticMember的实例

StaticMember CanIniStaticMember::sm;

int main()
{
	
}

  

结果:

 

 结论:类中的静态成员只与自己是否手动初始化静态成员有关,而与是否创建类的对象无关。即:如果你不手动初始化类的静态成员,该静态成员便永远都不会被初始化。

posted @ 2019-09-11 10:42  机智的小小帅  阅读(1251)  评论(0编辑  收藏  举报