名前空間
変種
操作

static specifier

提供: cppreference.com
< cpp‎ | language

クラス内で、特定のインスタンスにバインドされていないメンバーを宣言します。

目次

[編集] 構文

static data_member (1)
static member_function (2)
1) 静的データメンバーを宣言します。
2) 静的メンバー関数を宣言します。

[編集] 解説

クラスの静的メンバーは、クラスオブジェクトとは関連付けられていません。静的ストレージ存続期間を有する独立したオブジェクトであるか、プログラム内で一度だけ、名前空間スコープで定義された通常の関数になります。

staticキーワードは、クラス内で、静的メンバーの宣言とともに使われるだけで、定義では使いません。

class X {
    static int n; // 宣言 ('static' を使う)
};
int X::n = 1; // 定義 ('static' を使わない)

クラス本体にある宣言は定義ではないため、メンバーを、そのメンバーが内部で宣言されている型を含む、不完全な型として宣言できます(ただしvoid以外)。

struct Foo;
struct S {
   static int a[]; // 不完全な型
   static Foo x; // 不完全な型
   static S s; // 不完全な型 (その型自体の宣言の中で)
};
 
int S::a[10]; // 定義、完全な型
struct Foo {};
Foo S::x; // 定義、完全な型
S S::s; // 定義、完全な型

クラス T の静的メンバー m を参照するには2つの形式が使えます。限定子付きの名前 T::m またはメンバーアクセス式 e.me->m です。e を評価すると、それぞれ T または T* になります。クラススコープが同じ場合は限定子をつける必要はありません。

struct X {
    static void f(); // 関数宣言
    static int n; // メンバー宣言
};
 
X g() { return X(); } // X を返す関数
 
void f() {
    X::f();  // 静的関数にアクセスする限定子付きの名前
    g().f(); // 静的関数にアクセスするメンバーアクセス式
}
 
int X::n = 7; // 定義
 
void X::f() { // 定義
    n = 1; // X::n は、このスコープでは単に n でアクセスできます。
}

静的メンバーは、class メンバーアクセス規則 (private, protected, public)に従います。

[編集] 静的メンバー関数

Static member functions are not associated with any object. When called, they have no this pointer. They cannot be virtual, const, or volatile. They cannot access non-static data members of the class. Address of a static member function may be stored in a regular pointer to function, but not in a pointer to member function.

[編集] 静的データメンバー

The static member objects are not part of the object. If the static member is declared thread_local(C++11およびそれ以降), there is one such object per thread. Otherwise, there is only one instance of the static member object in the entire program, with static storage duration. The static members exist even if no objects of the class have been defined.

Static data members cannot be mutable.

Static data members of a class in namespace scope have external linkage if the class itself has external linkage (i.e. it's not a member of unnamed namespace)

Local classes (classes defined inside functions) and unnamed classes, including member classes of unnamed classes, cannot have static data members.

[編集] 静的定数メンバー

If a static data member of integral or enumeration type is declared const (and not volatile), it can be initialized with a brace-or-equal initializer that is a constant expression, right inside the class definition:

struct X {
    const static int n = 1;
    const static int m{2}; // C++11 以降
};

If a static data member of LiteralType is declared constexpr, it can be initialized with a brace-or-equal initializer that is a constant expression inside the class definition:

struct X {
    constexpr static int n = 1;
};
(C++11およびそれ以降)

If such a member is odr-used, a definition at namespace scope is still required, but it should not have an initializer.

struct X {
    const static int n = 1;
};
const int* p = &X::n; // X::n is odr-used
const int X::n;       // …なので、定義が必要になります。

[編集] 参考

テンプレート:ref std c++11 テンプレート:ref std テンプレート:ref std end テンプレート:ref std c++98 テンプレート:ref std テンプレート:ref std end

[編集] その他