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

      

    结果:

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

  • 相关阅读:
    Android Studio使用百度地图(二)
    Android Studio使用百度地图(一)
    寒假每日日报30(体温登记app——进度3)
    EF CodeFirst数据注解特性详解
    EF CodeFirst配置领域类
    EF CodeFirst简介、默认约定、数据库初始化策略
    EF CodeFirst关于Mysql如何自动生成数据库表
    EF的预先加载--Eager Loading
    EF的延迟加载LazyLoad
    ADO.NET中sqlserver和mysql的变量名
  • 原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11504889.html
Copyright © 2011-2022 走看看