为什么我们不允许在没有公共成员函数的情况下访问类外的私有静态成员?

时间:2015-10-20 23:20:41

标签: c++ static static-members private-members

这可能是一个愚蠢的疑问,但我无法理解为什么当我被允许定义它时,我无法访问类外的私有静态数据成员。

例如:在以下代码中:

class foo
{
    static int A;
    public:
       int getA{return A;}
};
//This is allowed
int foo:A=0;
int main()
{
   //This gives error
   cout<<foo:A;
}

1 个答案:

答案 0 :(得分:2)

int foo::A = 0;

为成员变量A分配存储空间,并使用0对其进行初始化(实际上默认情况下使用0初始化静态,因此赋值是多余的)。您只在实现.cpp文件中执行此操作一次。然后每个人都可以在没有任何链接器问题的情况下实例化您的类。请注意,您无法再次执行此操作,即稍后分配foo::A = 42;将无法编译,因此您不会破坏任何访问规则。您必须明确分配存储的事实是一种语言规则,在我看来这会产生更多的混淆(我会在您声明静态时让编译器自动分配存储空间)。

因此,总而言之,允许定义私有成员到目前为止并不像以后访问它/修改它那样危险,并且与后者非常不同。一旦成员分配了存储空间,该对象就已经为外界密封了。