Может ли метод Static получить доступ к закрытому методу того же класса?

У меня есть этот вопрос из-за конструктора singleton/named. В обоих случаях реальные конструкторы защищены или закрыты, ни один из которых не доступен извне.

Например, конструктор с коротким именем выглядит следующим образом:

 class A
{
  public:
    static A createA() { return A(0); } // named constructor
  private:
    A (int x);
};
int main(void)
{
   A a = A::createA(); 
}

Я думал, что статический метод может получить доступ только к статическому элементу данных или получить доступ к личным данным/методам через существующий объект. Однако в приведенном выше коде частный конструктор A() не является статическим, и в то время, когда он вызывается, объект не существует. Поэтому единственное объяснение, о котором я могу думать, это то, что статический метод может получить доступ к нестационарному частному методу того же класса. Может ли кто-нибудь угодить или утверждать или отрицать мою мысль, возможно, с некоторыми пояснениями?

Извиняюсь, если это слишком тривиально, но ключевые слова слишком распространены, и я не смог найти ответ на десятках страниц Google. Спасибо заранее.

Ответ 1

Статическая функция-член имеет те же права доступа, что и нестационарная функция-член. Так что да, он может получить доступ к любой публичной, защищенной и частной переменной в классе. Однако вам нужно передать экземпляр класса функции, чтобы функция имела возможность доступа к члену. В противном случае статическая функция может напрямую обращаться к любому другому статическому члену в классе.

Ответ 2

В соответствии со стандартом §11/p2 Контроль доступа элемента [class.access] (выделение):

Член класса может также получить доступ ко всем именам, к которым относится класс имеет доступ. Локальный класс функции-члена может обращаться к тому же имена, к которым может обращаться сама функция-член. 113

113) Разрешения доступа, таким образом, являются транзитивными и кумулятивными для вложенных и локальных классов.

Поскольку статическая функция-член является членом класса, он имеет доступ ко всем именам, к которым имеет доступ класс, и, следовательно, к конструктору самого класса.

Следовательно, в вашем примере:

class A {
  A(int x);  
public:
  static A createA() { return A(0); } // named constructor  
};

static member function A::createA() имеет доступ к вызову private конструктор A::A(int).

Ответ 3

В рамках функции класса (включая функции static) все данные и функции элемента private доступны, даже если вы имеете дело с другим экземпляром этого класса внутри этой функции.

Вы часто используете это при написании конструкторов копий и операторов присваивания.

(Мой босс часто говорит о том, как он хотел бы отключить это поведение, используя какой-то синтаксис friend = delete;.)

Ответ 4

Да, это возможно. Статическая функция может получить доступ к частным членам, но кроме этого она похожа на любую функцию, определенную вне класса. Особенно, поскольку он не имеет указателя this (т.е. Не привязан к какому-либо конкретному экземпляру), вы не сможете напрямую обращаться к каким-либо членам (которые всегда привязаны к экземпляру): если вы хотите это сделать, вам нужен экземпляр где-то:

#include <iostream>
using namespace std;

class A
{
  public:
    static A createA() { return A(0); }
    static void dosomething(A *a) { return a->something(); }
  private:
    A (int x) { cout << "ctor" << endl; }
    void something() { cout << "something" << endl; }
};

int main(void)
{
   A a = A::createA(); 
   A::dosomething(&a); 
   return 0;
}

Ответ 5

Ваш статический метод не имеет доступа к статическому элементу или любому нестатическому члену существующего экземпляра. Это просто создание нового экземпляра.