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

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()
{
	
}

  

结果:

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

 

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

相关文章:

  • 2022-01-15
  • 2022-12-23
  • 2022-12-23
  • 2021-05-21
  • 2022-12-23
  • 2021-06-12
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-29
  • 2021-07-07
  • 2021-09-29
  • 2022-12-23
  • 2022-12-23
  • 2021-07-20
  • 2021-10-30
相关资源
相似解决方案