2

次の例 (ここから取得) では、プライベートな静的変数 x があり、クラスの外部でその名前を変更します。私を混乱させているのは、クラス外でプライベート変数を変更できるのはなぜですか? それを宣言する理由は何ですかprivate

// static_member_functions.cpp
#include <stdio.h>

class StaticTest
{
private:
    static int x;
public:
    static int count()
    {
        return x;
    }
};

int StaticTest::x = 9;

int main()
{
    printf_s("%d\n", StaticTest::count());
}
4

3 に答える 3

4

これは「変数の変更」ではなく、定義です。

すべてstaticのメンバーは、クラスの外部で定義static int x;する必要があります (は単なる宣言です。削除int StaticTest::x = 9;すると、「未定義の参照」などのリンカ エラーが発生しますStaticTest::x)。


で変更してみてくださいmain。たとえば、次のようにします。

StaticTest::x = 13;

そして、あなたが期待していたエラーが発生します(error: ‘int StaticTest::x’ is private)。

于 2013-04-10T08:08:46.387 に答える
0

変数はクラス外では変更されません。

このわずかに変更された例を考えてみましょう:

class StaticTest
{
    private:
        static int x;

    public:
        static int count();
};

int StaticTest::x = 9;

int StaticTest::count()
{
    return x;
}

どちらも「クラス*の外側でx 初期化されず、その外側でアクセスされません。class { }ブロックはクラスメンバーを宣言するだけです。スコープ修飾子は、およびの後続の定義がクラスの一部であるStaticTest::ことをコンパイラに伝えます。xcount()StaticTest

あなたからアクセスしてみxてくださいmain()

int main()
{
    printf_s("%d\n", StaticTest::x);
}

xプライベートなので、それは不可能であることがわかります。

これは、宣言 (.hpp ヘッダー ファイル内) を実装 (.cpp 実装ファイル内) から分離できるようにするためです。(テンプレートを使い始めるとこれは壊れますが、完璧なものはありません。)

于 2013-04-10T08:12:44.910 に答える
0

アクセス制御は可視性に影響しません。クラスのプライベート メンバーは、静的であるかどうかに関係なく、どこでも可視です。

アクセス制御は、管理するエンティティではなく、名前またはシンボルへの "アクセス" (可視性ではない) に影響し、名前に関係なく、すべての名前へのアクセスに影響します。アクセス制御は可視性に影響を与えないため、名前の検索で名前が検索されますが、アクセス権がない場合はエラーになります (同じ名前のエンティティにアクセス権がある場合でも)。

あなたの例に関しては、私は問題を理解していません。への唯一のアクセスStaticTest::xはメンバー関数にあります StaticTest::count()。なぜこれが問題になるのでしょうか?

于 2013-04-10T08:12:49.343 に答える