クラス
クラスはユーザ定義の型です。
クラス型は、宣言の decl-specifier-seq 内に現れる、 class 指定子によって定義されます。 class 指定子は以下の構文を持ちます。
class-keyattrclass-head-name{ member-specification} | (1) | ||||||||
class-keyattrclass-head-name: base-specifier-list{ member-specification} | (2) | ||||||||
class-key | - | class, struct, union のいずれか |
attr(C++11) | - | オプショナルな任意の数の属性の並び |
class-head-name | - | 定義されているクラスの名前。 オプショナルな nested-name-specifier (名前とスコープ解決演算子の並びで、スコープ解決演算子で終わる) を前に置くことができ、オプショナルな final キーワードを後ろに置くことができます。 名前は省略することもでき、その場合、そのクラスは名前なしになります (名前なしのクラスは final にできないことに注意してください) |
base-specifier-list | - | ひとつ以上の親クラスのリストおよびそれぞれに対して使用される継承のモデル (派生クラスを参照してください) |
member-specification | - | アクセス指定子、メンバオブジェクトおよびメンバ関数の宣言および定義 (クラスの定義を参照してください) |
クラスキー struct
と class
は、以下の点を除き、 C++ では区別されません。 クラスの宣言で struct
クラスキーを使用した場合はデフォルトのアクセスモードおよびデフォルトの継承モードは public
となり、クラスの宣言で class
クラスキーを使用した場合は private
になります。 class
と struct
はどちらもクラスの定義で使用できます。
クラスキー union
を使用すると、共用体の定義になり、一度にそのデータメンバのいずれかひとつのみを保持できるクラスを定義します。
クラスは以下の種類のメンバを持つことができます。
すべてのメンバはクラス定義内で一度に定義され、 (名前空間のメンバと異なり) すでに定義済みのクラスに追加することはできません。
クラス T
のメンバは、そのメンバが静的データメンバ、メンバ関数、メンバ型、メンバテンプレート 、スコープなし列挙の列挙子、メンバ無名共用体のメンバである場合、その名前として T
を使用することはできません。 しかし、非静的データメンバは、ユーザ宣言されたコンストラクタが存在しない限り、名前 T
を使用することができます。
少なくともひとつの仮想メンバ関数を宣言または継承するクラスは多相です。 この型のオブジェクトは多相オブジェクトであり、オブジェクト表現の一部として格納される実行時型情報を持ち、 dynamic_cast および typeid を用いてそれを問い合わせることができます。 仮想メンバ関数は動的束縛に参加します。
少なくともひとつの純粋仮想メンバ関数を宣言または継承するクラスは抽象クラスです。 この型のオブジェクトは作成できません。
constexpr コンストラクタを持つクラスは LiteralType です。 この型のオブジェクトはコンパイル時に constexpr 関数によって操作できます。
いくつかのメンバ関数は特別です。 これらは、特定の状況においては、ユーザによって定義されない場合でも、コンパイラによって定義されます。 これらには以下のものがあります。
- デフォルトコンストラクタ
- コピーコンストラクタ
- ムーブコンストラクタ(C++11以上)
- コピー代入演算子
- ムーブ代入演算子(C++11以上)
- デストラクタ