Flo*_*oud 17 c++ static-methods
我有这个问题,因为单例/命名构造函数.在这两种情况下,真正的构造函数都是受保护的或私有的,两者都不能从外部访问.
例如,一个简短的命名构造函数是这样的:
class A
{
public:
static A createA() { return A(0); } // named constructor
private:
A (int x);
};
int main(void)
{
A a = A::createA();
}
Run Code Online (Sandbox Code Playgroud)
我认为静态方法只能访问静态数据成员,或通过现有对象访问私有数据/方法.但是,在上面的代码中,私有构造函数A()不是静态的,并且在调用它时,也不存在任何对象.所以我能想到的唯一解释是静态方法可以访问同一个类的非静态私有方法.任何人都可以肯定或否定我的想法,可能有一些解释?
我很抱歉,如果这太微不足道,但关键词太常见了,我无法在几十个谷歌页面找到答案.提前致谢.
Nat*_*ica 11
静态成员函数具有与非静态成员函数相同的访问权限.所以是的,它可以访问类中的任何公共变量,受保护变量和私有变量.但是,您需要将类的实例传递给函数,以便函数能够访问该成员.否则,静态函数只能直接访问类中的任何其他静态成员.
根据标准§11/ p2成员访问控制[class.access] (Emphasis Mine):
类的成员还可以访问该类可以访问的所有名称.成员函数的本地类可以访问成员函数本身可以访问的相同名称.113
113)因此,访问权限对于嵌套和本地类是可传递和累积的.
由于静态成员函数是类的成员,因此它可以访问类可以访问的所有名称,从而访问类本身的构造函数.
因此,在您的示例中:
class A {
A(int x);
public:
static A createA() { return A(0); } // named constructor
};
Run Code Online (Sandbox Code Playgroud)
static member function A::createA()可以访问call private构造函数A::A(int).