为什么我们不允许在没有 public 成员函数的情况下访问 class 之外的私有静态成员?
Why aren't we allowed to access a private static member outside class without public member function?
这可能是一个愚蠢的疑问,但我无法理解为什么当我被允许定义时我无法访问 class 之外的私有静态数据成员。
例如:在以下代码中:
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;
}
int foo::A = 0;
为成员变量A
分配存储空间,并用0
初始化它(实际上一个static默认用0
初始化,所以赋值是多余的)。您只需在实现 .cpp 文件中执行此操作一次。然后每个人都可以实例化您的 class 而不会出现任何链接器问题。请注意,您不能再次执行此操作,即稍后分配 foo::A = 42;
将不会编译,因此您不会破坏任何访问规则。您必须显式分配存储空间这一事实是一项语言规则,在我看来这会造成更多混乱(我会让编译器在您声明静态时自动分配存储空间)。
因此,总而言之,被允许定义私有成员远不如以后访问 it/modify 危险,并且与后者有很大不同。一旦成员分配了存储空间,对象就已经对外密封。
这可能是一个愚蠢的疑问,但我无法理解为什么当我被允许定义时我无法访问 class 之外的私有静态数据成员。
例如:在以下代码中:
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;
}
int foo::A = 0;
为成员变量A
分配存储空间,并用0
初始化它(实际上一个static默认用0
初始化,所以赋值是多余的)。您只需在实现 .cpp 文件中执行此操作一次。然后每个人都可以实例化您的 class 而不会出现任何链接器问题。请注意,您不能再次执行此操作,即稍后分配 foo::A = 42;
将不会编译,因此您不会破坏任何访问规则。您必须显式分配存储空间这一事实是一项语言规则,在我看来这会造成更多混乱(我会让编译器在您声明静态时自动分配存储空间)。
因此,总而言之,被允许定义私有成员远不如以后访问 it/modify 危险,并且与后者有很大不同。一旦成员分配了存储空间,对象就已经对外密封。