staticキーワードは一般的に内部リンケージに関連していますが、クラス内で使用されるstaticキーワードには外部リンケージがありますか?以下の変数m、nは、クラスファイルの外部からアクセスできます。
class c {
int i;
int j;
static int m;
static int n;
public:
void zap();
static void clear();
};
右。
キーワードstatic
は、非常に多くの異なる意味で非常に過負荷になっています。
コメントで述べたように、メンバーは、個々のオブジェクトではなく、クラスstatic
にのみ関連付けられているメンバーです。
static
メンバーはクラスに属しています; 変数の場合、オブジェクトなしでアクセスでき、インスタンス間で共有されます。struct Foo { static void *bar; static void *fu(); }
そう
Foo::bar
そしてFoo::fu
合法です。
これらは、C++03標準の§9.4で導入されています。
クラスのデータまたは関数のメンバーは、
static
クラス定義で宣言できます。その場合、それはクラスの静的メンバーです。クラスの
static
メンバーは、 qualified-id式を使用して参照できます。メンバーを参照するためにクラスメンバーアクセス構文(5.2.5)を使用する必要はありません。クラスメンバーアクセス構文を使用してメンバーを参照できます。その場合、オブジェクト式が評価されます。s
X
X::s
static
static
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();
..。
静的メンバーはクラスのメンバーであり、特定のオブジェクトインスタンスではないと言えます。つまり、すべてのオブジェクトインスタンスで同じ値になります。
静的メンバー関数は、値はありませんが、それ以外は同じです。オブジェクトインスタンスごとに一意である代わりに、クラスの一部として表示できます。これは、this
ポインターがなく、非静的メンバー変数にアクセスできないことを意味します。