クラス メンバーの概要

class または struct は、そのメンバーで構成されます。 クラスが行う作業は、そのメンバー関数によって実行されます。 クラスが維持する状態は、そのデータ メンバー内に格納されます。 メンバーの初期化はコンストラクターによって実行され、メモリの解放とリソースの解放などのクリーンアップ作業はデストラクターによって実行されます。 C++11 以降では、データ メンバーは宣言の時点で初期化することができます (通常はその必要があります)。

クラス メンバーの種類

メンバーのカテゴリの完全な一覧は次のとおりです。

クラス宣言の例

次の例は、単純なクラス宣言を示しています。

// TestRun.h

class TestRun
{
    // Start member list.

    // The class interface accessible to all callers.
public:
    // Use compiler-generated default constructor:
    TestRun() = default;
    // Don't generate a copy constructor:
    TestRun(const TestRun&) = delete;
    TestRun(std::string name);
    void DoSomething();
    int Calculate(int a, double d);
    virtual ~TestRun();
    enum class State { Active, Suspended };

    // Accessible to this class and derived classes only.
protected:
    virtual void Initialize();
    virtual void Suspend();
    State GetState();

    // Accessible to this class only.
private:
    // Default brace-initialization of instance members:
    State _state{ State::Suspended };
    std::string _testName{ "" };
    int _index{ 0 };

    // Non-const static member:
    static int _instances;
    // End member list.
};

// Define and initialize static member.
int TestRun::_instances{ 0 };

メンバーのアクセシビリティ

クラスのメンバーは、メンバーの一覧で宣言されます。 クラスのメンバー一覧は、アクセス指定子と呼ばれるキーワードを使用して、任意の数の privateprotected、および public セクションに分割できます。 コロン : はアクセス指定子に従う必要があります。 これらのセクションは連続している必要はありません。つまり、これらのキーワードはいずれも、メンバー リスト内で複数回出現してもかまいません。 キーワードは、次のアクセス指定子または右中かっこまでのすべてのメンバーのアクセスを指定します。 詳細については、「メンバー アクセス コントロール (C++)」を参照してください。

静的メンバー

データ メンバーが静的として宣言されることがあります。この場合、クラスのすべてのオブジェクトは、そのデータ メンバーの同じコピーにアクセスできます。 メンバー関数が静的として宣言されることがあります。この場合、そのメンバー関数は、クラスの静的データ メンバーにのみアクセスできます (this ポインターはありません)。 詳細については、「静的データ メンバー」を参照してください。

特殊なメンバー関数

特殊なメンバー関数は、ソース コードで指定しない場合、コンパイラによって自動的に提供される関数です。

  • 既定のコンストラクター

  • コピー コンストラクター

  • (C++11) 移動コンストラクター

  • コピー代入演算子

  • (C++11) 移動代入演算子

  • デストラクターです。

詳細については、「特殊なメンバー関数」を参照してください。

メンバーごとの初期化

C++11 以降では、非静的メンバーの宣言子に初期化子を含めることができます。

class CanInit
{
public:
    long num {7};       // OK in C++11
    int k = 9;          // OK in C++11
    static int i = 9; // Error: must be defined and initialized
                      // outside of class declaration.

    // initializes num to 7 and k to 9
    CanInit(){}

    // overwrites original initialized value of num:
    CanInit(int val) : num(val) {}
};
int main()
{
}

メンバーにコンストラクターの値が割り当てられている場合、その値は宣言時に割り当てられた値を上書きします。

特定のクラス型のすべてのオブジェクトの静的データ メンバーの共有コピーが 1 つだけあります。 静的データ メンバーは必ず定義する必要があり、ファイル スコープで初期化できます 静的データ メンバーの詳細については、「静的データ メンバー」を参照してください。 次の例では、静的データ メンバーを初期化する方法を示します。

// class_members2.cpp
class CanInit2
{
public:
    CanInit2() {} // Initializes num to 7 when new objects of type
                 //  CanInit are created.
    long     num {7};
    static int i;
    static int j;
};

// At file scope:

// i is defined at file scope and initialized to 15.
// The initializer is evaluated in the scope of CanInit.
int CanInit2::i = 15;

// The right side of the initializer is in the scope
// of the object being initialized
int CanInit2::j = i;

Note

クラス名 CanInit2 は、定義中の ii クラスのメンバーであることを指定するために、CanInit2 の前に配置される必要があります。

関連項目

クラスと構造体