来自http://www.learncpp.com/cpp-tutorial/812-static-member-functions/的代码示例:
class Something
{
private:
static int s_nValue;
};
int Something::s_nValue = 1;
此代码编译时没有警告或错误。我不明白为什么。
我们不应该因尝试访问s_nValue
而收到警告,因为它是私有的吗?或者这些访问说明符不适用于静态成员?
答案 0 :(得分:8)
s_nValue
的定义不是从类外部“访问”成员 - 它实际上是它的实现。可以认为这就像成员函数的实际实现一样,如果放在封闭类声明之外的源文件中。
换句话说,访问说明符绝对同样适用于静态成员。
答案 1 :(得分:2)
这是类的private
静态成员的定义,因此是允许的。因为类的静态成员的定义必须超出类,无论是private
还是public
。
简而言之,它不是访问成员,而是定义它,就像你在外面定义 private
函数一样班级。
答案 2 :(得分:1)
另请注意:不要在Assignment和Contructors之间混淆。这一行:
int Something::s_nValue = 1;
不是“赋值”一个值,它是构造对象。一般而言:
ClassA Something::s_nValue(...parameters...);
C ++允许Contructors的“赋值”样式语法。例如:
class A
{
public:
A(int i) { m_i = i; }
int getI() { return m_i; }
private:
int m_i;
};
class B
{
public:
static int getAI() { return a.getI(); }
private:
static A a;
};
A B::a = 2;