Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:为什么在定义类对象时可以直接调用受保护的构造函数?_C++_Oop - Fatal编程技术网

C++ C++;:为什么在定义类对象时可以直接调用受保护的构造函数?

C++ C++;:为什么在定义类对象时可以直接调用受保护的构造函数?,c++,oop,C++,Oop,我在网上读了一篇文章,源代码是: class ASingleton { public: static ASingleton* getInstance() { return &m_data; } void do_something() { cout<<"ASingleton do_something!"<<end

我在网上读了一篇文章,源代码是:

      class ASingleton
    {
    public:
        static ASingleton* getInstance()
        {
            return &m_data;
        }
        void do_something()
        {
            cout<<"ASingleton do_something!"<<endl;
        }
    protected:
        static ASingleton m_data; //static data member 在类中声明,在类外定义
        ASingleton();
        ~ASingleton() {}
    };

    class BSingleton
    {
    public:
        static BSingleton* getInstance()
        {
            return &m_data;
        }
        void do_something()
        {
            cout<<"BSingleton do_something!"<<endl;
        }
    protected:
        static BSingleton m_data; //static data member 在类中声明,在类外定义
        BSingleton();
        ~BSingleton() {}
    };

    ASingleton ASingleton::m_data;
    BSingleton BSingleton::m_data;

    ASingleton::ASingleton()
    {
        cout<<"ASingleton constructor!"<<endl;
        BSingleton::getInstance()->do_something();
    }

    BSingleton::BSingleton()
    {
        cout<<"BSingleton constructor!"<<endl;
    }

    int main()
    {
        return 0;
    }

我的问题是:这两个类的构造函数都受到保护,为什么不能通过定义(ASingleton ASingleton::m_data;BSingleton BSingleton::m_data;)调用它们?我认为受保护的函数只能在子类中调用,不是吗?

这里没有冲突
ASingleton
具有返回实例的
publicstatic
方法
getInstance()

由于
getInstance()
ASingleton
的成员,因此它可以完全访问其类中实现的所有方法。它不会仅仅因为是静态的而成为类的外部


此外,
m_data
只是这些单例的类内实例。它们在运行时在自己的类声明的范围内静态初始化。

但是在main()或object definitionRight中不调用getInstance(),因为每个类也包含其自身的
静态
实例。您的意思是它是声明(在类内部),而不是定义(类外)隐式调用构造函数?隐式调用构造函数的定义不是吗?类内的静态字段只是声明-它不会“存在”尽管如此,该定义被视为在类本身的范围内,就像函数定义一样。
m_data
ASingleton
的范围内,因此它可以使用私有和受保护的成员。您不能编写
ASingleton foo;
    ASingleton constructor!
    BSingleton do_something!
    BSingleton constructor!