6

staticキーワードは一般的に内部リンケージに関連していますが、クラス内で使用されるstaticキーワードには外部リンケージがありますか?以下の変数m、nは、クラスファイルの外部からアクセスできます。

class c {
    int i;
    int j;
    static int m;
    static int n;

    public:
    void zap();
    static void clear();
};
4

3 に答える 3

10

右。

キーワードstaticは、非常に多くの異なる意味で非常に過負荷になっています。

  • 名前空間スコープの変数または関数では、内部リンケージという名前が付けられます。
  • クラスメンバーでは、静的メンバーになりますが、リンケージには影響しません。
  • 関数スコープの変数では、「自動」または「動的」ストレージ期間ではなく、変数「静的ストレージ期間」を提供します(つまり、変数の有効期間は、グローバル変数のようにプログラムの最後まで延長されます)。
于 2012-08-28T00:09:21.083 に答える
2

コメントで述べたように、メンバーは、個々のオブジェクトではなく、クラスstaticにのみ関連付けられているメンバーです。

staticメンバーはクラスに属しています; 変数の場合、オブジェクトなしでアクセスでき、インスタンス間で共有されます。

struct Foo {
  static void *bar;
  static void *fu();
}

そうFoo::barそしてFoo::fu合法です。

これらは、C++03標準の§9.4で導入されています。

  1. クラスのデータまたは関数のメンバーは、staticクラス定義で宣言できます。その場合、それはクラスの静的メンバーです。

  2. クラスのstaticメンバーは、 qualified-id式を使用して参照できます。メンバーを参照するためにクラスメンバーアクセス構文(5.2.5)を使用する必要はありません。クラスメンバーアクセス構文を使用してメンバーを参照できます。その場合、オブジェクトが評価されます。sXX::sstaticstatic

    class process {
    public:
        static void reschedule();
    };
    process& g();
    
    void f()
    {
        process::reschedule(); // OK: no object necessary
        g().reschedule(); // g() is called
    }
    

    メンバーは、そのクラスのstaticスコープ内で直接参照される場合と、そのクラスから派生したクラスのスコープ内で参照される場合があります(10節)。この場合、staticメンバーは、修飾ID式が使用されたかのように参照され、修飾IDのネストされた名前指定子は、メンバーが参照されるクラススコープに名前を付けます。static

    int g();
    struct X {
        static int g();
    };
    struct Y : X {
        static int i;
    };
    int Y::i = g(); // equivalent to Y::g();
    

    ..。

于 2012-08-28T00:14:23.003 に答える
1

静的メンバーはクラスのメンバーであり、特定のオブジェクトインスタンスではないと言えます。つまり、すべてのオブジェクトインスタンスで同じ値になります。

静的メンバー関数は、値はありませんが、それ以外は同じです。オブジェクトインスタンスごとに一意である代わりに、クラスの一部として表示できます。これは、thisポインターがなく、非静的メンバー変数にアクセスできないことを意味します。

于 2012-08-28T00:02:35.187 に答える