zoukankan      html  css  js  c++  java
  • 构造函数能默认初始化其静态成员么?

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

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

      

    结果:

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

  • 相关阅读:
    剑指Offer——旋转数组的最小数字
    剑指Offer——用两个栈实现队列
    剑指Offer——从尾到头打印链表
    剑指Offer——替换空格
    剑指Offer——二维数组中的查找
    剑指Offer——数据流中的中位数
    剑指Offer——字符流中第一个不重复的字符
    剑指Offer——删除链表中重复的结点
    运维常用shell脚本
    log4cxx的使用
  • 原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11504889.html
Copyright © 2011-2022 走看看