由于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()
不是静态的,并且在调用它时,也不存在任何对象。
所以我能想到的唯一解释是静态方法可以访问同一个类的非静态私有方法。任何人都可以肯定或否定我的想法,可能有一些解释?
如果这太微不足道,我很抱歉,关键词太常见了,而且我无法在几十个谷歌网页中找到答案。提前谢谢。
答案 0 :(得分:10)
静态成员函数与非静态成员函数具有相同的访问权限。所以是的,它可以访问类中的任何公共变量,受保护变量和私有变量。但是,您需要将类的实例传递给函数,以便函数能够访问该成员。否则,静态函数只能直接访问类中的任何其他静态成员。
答案 1 :(得分:6)
根据标准§11/ p2会员访问控制[class.access] (强调我的) :
类的成员也可以访问该类的所有名称 有权访问。成员函数的本地类可以访问它 成员函数本身可以访问的名称。 113
113)访问权限因此是可传递的,并且对嵌套和本地类累积。
由于静态成员函数是类的成员,因此它可以访问类可以访问的所有名称,从而访问类本身的构造函数。
因此,在您的示例中:
class A {
A(int x);
public:
static A createA() { return A(0); } // named constructor
};
静态成员函数A::createA()
可以调用private
构造函数A::A(int)
。
答案 2 :(得分:1)
在类(包括static
函数)的函数内,所有 private
成员数据和函数都可以访问,即使您正在处理不同的该函数中该类的实例。
在编写复制构造函数和赋值运算符时经常会使用它。
(我的老板经常谈论他希望如何使用某种friend = delete;
语法来禁用此行为。)
答案 3 :(得分:1)
是的,它可以。静态函数可以访问私有成员,但除此之外,它就像在类外定义的任何函数一样。特别是,由于它没有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;
}
答案 4 :(得分:1)
跟进此事,为什么不允许这样做呢?如果允许创建对象,为什么不允许创建指向它的指针?
using namespace std;
class A
{
public:
static std::unique_ptr<A> createA() {
return std::make_unique<A>(0);
}
private:
A (int x) { y = x;}
int y;
};
int main(void)
{
auto a = A::createA();
return 0;
}
答案 5 :(得分:0)
您的静态方法不访问任何静态成员,也不访问现有实例的任何非静态成员 它只是创建一个新实例。