Может ли метод 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
Ваш статический метод не имеет доступа к статическому элементу или любому нестатическому члену существующего экземпляра.
Это просто создание нового экземпляра.