Classes
クラスはユーザー定義型です。
クラス型は、クラス指定子によって定義され、これは 宣言 構文の decl-specifier-seq 内に現れます。クラス指定子の構文については、 class declaration を参照してください。
クラスは以下の種類のメンバを持つことができます:
すべてのメンバーはクラス定義内で一度に定義され、既に定義されたクラスに追加することはできません(名前空間のメンバーとは異なります)
クラスのメンバが以下の場合、
T
をその名前として使用することはできません:
- 静的データメンバ、
- メンバ関数、
- メンバ型、
- メンバテンプレート、
- 列挙型の列挙子 (スコープ付き列挙型でない場合) (C++11以降) 、または
- メンバ匿名共用体のメンバ。
ただし、ユーザー宣言されたコンストラクタが存在しない場合に限り、非静的データメンバーは
T
という名前を使用できます。
少なくとも1つの宣言済みまたは継承された
virtual
メンバ関数を持つクラスは
ポリモーフィック
です。この型のオブジェクトは
ポリモーフィックオブジェクト
であり、オブジェクト表現の一部として実行時型情報が格納されており、
dynamic_cast
および
typeid
で問い合わせることができます。仮想メンバ関数は動的バインディングに参加します。
少なくとも1つの宣言済みまたは継承された純粋仮想メンバ関数を持つクラスは、 abstract class です。この型のオブジェクトは作成できません。
|
constexpr コンストラクタを持つクラスは LiteralType です:この型のオブジェクトはコンパイル時に constexpr 関数で操作できます。 |
(C++11以降) |
目次 |
クラスのプロパティ
トリビアルコピー可能クラストリビアルコピー可能クラス は以下の条件を満たすクラスである:
標準レイアウトクラス標準レイアウトクラス は以下の条件を満たすクラスである:
標準レイアウト構造体 はクラスキーワード struct またはクラスキーワード class で定義された標準レイアウトクラスである。 標準レイアウト共用体 はクラスキーワード union で定義された標準レイアウトクラスである。 |
(C++11以降) |
暗黙の生存期間クラス
暗黙の生存期間を持つクラス( implicit-lifetime class )とは、以下の条件を満たすクラスです
- デストラクタが user-declared (until C++11) user-provided (since C++11) でない aggregate である、または
- 少なくとも1つのtrivial eligible constructorとtrivial、非deletedなdestructorを持つ。
注記: 暗黙の生存期間プロパティは欠陥報告書 P0593R6 によって明確化されました。
PODクラスPODクラス とは、以下の条件を満たすクラスである:
POD構造体 は非共用体のPODクラスである。 POD共用体 はPODクラスである共用体である。 |
(C++20で非推奨) |
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用バージョン | 公開時の動作 | 修正後の動作 |
|---|---|---|---|
| CWG 148 | C++98 |
PODクラスはメンバへのポインタを含むことができなかった、
これらはそれ自体がPOD(スカラー)型である |
制限を解除 |
| CWG 383 | C++98 |
コピー代入演算子またはデストラクタは、
定義されていない場合、PODクラスでユーザー宣言可能であった |
許可されない |
| CWG 1363 | C++11 |
自明なデフォルトコンストラクタと非自明な
デフォルトコンストラクタを同時に持つクラスは自明となり得た |
非自明となる |
| CWG 1496 | C++11 |
すべてのコンストラクタが削除定義されている
クラスは自明となり得た |
非自明となる |
| CWG 1672 | C++11 |
複数の空の基底クラスを持つクラスは
標準レイアウトクラスとなり得た |
標準レイアウトクラスではない |
| CWG 1734 | C++11 |
自明にコピー可能なクラスは非自明な
削除されたコピー/ムーブコンストラクタ/代入演算子を持つことができなかった |
削除されている場合は自明となり得る |
| CWG 1813 | C++11 |
非静的データメンバを継承する基底クラスを持つ場合、
クラスは標準レイアウトクラスではなかった |
標準レイアウトクラスとなり得る |
| CWG 1881 | C++11 |
標準レイアウトクラスとその基底クラスについて、
無名ビットフィールドはデータメンバを宣言する 異なるクラスで宣言され得た |
すべての非静的データメンバ
とビットフィールドは最初に 同じクラスで宣言される必要がある |
| CWG 1909 | C++98 | メンバテンプレートはクラス名と同じ名前を持つことができた | 禁止 |
| CWG 2120 | C++11 |
標準レイアウトクラスを決定する際のM(X)の定義は、
最初のメンバが配列であるクラスのケースを 考慮していなかった |
M(X)の定義でこのケースを
対応 |
| CWG 2605 | C++98 | 暗黙の生存期間クラスはユーザー提供のデストラクタを持つことができた | 禁止 |