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

      

    结果:

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

  • 相关阅读:
    Using Boost C++ libraries with gcc g++ under Windows(cygwin+netbeans)
    RFC中文目录
    GNU Make 学习笔记(一)
    make
    ODBC连接ORACLE数据库的设置
    windows下boost开发环境简易教程(cygwin+eclipse)
    GNU Make(二)
    C++虚函数表解析(转)
    如何判断adoquery中字段值是不是空值?
    Delphi ListView基本用法大全
  • 原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11504889.html
Copyright © 2011-2022 走看看