クラス メンバーの概要
class または struct は、そのメンバーで構成されます。 クラスが行う作業は、そのメンバー関数によって実行されます。 クラスが維持する状態は、そのデータ メンバー内に格納されます。 メンバーの初期化はコンストラクターによって実行され、メモリの解放とリソースの解放などのクリーンアップ作業はデストラクターによって実行されます。 C++11 以降では、データ メンバーは宣言の時点で初期化することができます (通常はその必要があります)。
クラス メンバーの種類
メンバーのカテゴリの完全な一覧は次のとおりです。
データ メンバー。組み込み型、およびその他のユーザー定義型などがあります。
オペレーター
入れ子にされたクラス宣言および)
列挙型。
フレンド。
-
Note
friend はクラス宣言内に含まれているため、前の一覧に含まれます。 ただし、これらは、クラスのスコープ内にないため、真のクラス メンバーではありません。
クラス宣言の例
次の例は、単純なクラス宣言を示しています。
// 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 };
メンバーのアクセシビリティ
クラスのメンバーは、メンバーの一覧で宣言されます。 クラスのメンバー一覧は、アクセス指定子と呼ばれるキーワードを使用して、任意の数の private、protected、および 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 は、定義中の i が i クラスのメンバーであることを指定するために、CanInit2 の前に配置される必要があります。