Static方法可以访问同一个类的私有方法吗?

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

静态成员函数具有与非静态成员函数相同的访问权限.所以是的,它可以访问类中的任何公共变量,受保护变量和私有变量.但是,您需要将类的实例传递给函数,以便函数能够访问该成员.否则,静态函数只能直接访问类中的任何其他静态成员.

  • @FlowingCloud 请参阅下文:“静态函数可以访问私有成员,但除此之外它就像类外部定义的任何函数一样。” 为了运行构造函数,您不需要对象。对于所有其他非静态类方法,您都可以这样做。 (3认同)
  • @FlowingCloud 构造函数就像静态函数。它不需要实例,因为它正在创建实例,这就是为什么它被称为特殊成员函数。所以调用它是可以的,因为你不需要实例。 (3认同)

101*_*010 7

根据标准§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).


Rob*_*ock 0

您的静态方法不会访问现有实例的任何静态成员或任何非静态成员。
它只是创建一个新实例。