C++ では、アクセス指定子は静的メンバーの可視性を制御しませんか?



http://www.learncpp.com/cpp-tutorial/812-static-member-functions/ のコード例:


class Something
{
private:
static int s_nValue;
};
int Something::s_nValue = 1;

このコードは、警告やエラーなしでコンパイルされます。理由がわかりません。


s_nValue にアクセスしようとすると、警告が表示されますか? プライベートだから?それとも、これらのアクセス指定子は静的メンバーには適用されませんか?


答え:


s_nValue の定義 クラスの外部からメンバーに「アクセス」しているのではなく、実際にはその実装です。囲んでいるクラスの宣言の外側のソース ファイルに配置されている場合、これはメンバー関数の実際の実装のようなものと考えてください。


つまり、アクセス指定子は静的メンバーに完全に等しく適用されます。


いくつかのコードの回答


class Something { private:
static int s_nValue;
};
int Something::s_nValue = 1;
int Something::s_nValue = 1;
ClassA Something::s_nValue(...parameters...);
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;