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!