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

时间:2015-11-10 09:33:48

标签: c++ oop

我在线阅读了一篇文章,源代码是:

      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 constructor!
    BSingleton do_something!
    BSingleton constructor!

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

1 个答案:

答案 0 :(得分:2)

此处没有违规行为。 ASingleton使用public static方法getInstance()返回实例。

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

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