クラス
クラスはユーザー定義型です。
クラス型は、宣言構文の decl-specifier-seq に現れる class-specifier によって定義されます。クラス宣言でクラス指定子の構文を参照してください。
クラスは以下の種類のメンバを持つことができます。
すべてのメンバはクラス定義内で一度に定義されます。既に定義されたクラスにメンバを追加することはできません(名前空間のメンバとは異なります)。
クラス T のメンバが以下の場合、そのメンバは T を名前として使用できません。
- 静的データメンバ、
- メンバ関数、
- メンバ型、
- メンバテンプレート、
- 列挙体の列挙子(その列挙体がスコープ付きである場合を除く)(C++11以降)、または
- メンバ無名共用体のメンバ。
ただし、非静的データメンバは、ユーザー宣言のコンストラクタが存在しない限り、名前 T を使用できます。
少なくとも1つの宣言または継承された仮想メンバ関数を持つクラスはポリモーフィックです。この型のオブジェクトはポリモーフィックオブジェクトであり、オブジェクト表現の一部として実行時型情報が格納されます。この情報は dynamic_cast や typeid で問い合わせることができます。仮想メンバ関数は動的ディスパッチに関与します。
少なくとも1つの宣言または継承された純粋仮想メンバ関数を持つクラスは抽象クラスです。この型のオブジェクトは作成できません。
|
constexpr コンストラクタを持つクラスはリテラル型 (LiteralType)です。この型のオブジェクトはコンパイル時に constexpr 関数によって操作できます。 |
(C++11以降) |
目次 |
[編集] クラスのプロパティ
トリビアルにコピー可能なクラストリビアルにコピー可能なクラスとは、以下の条件を満たすクラスです。
スタンダードレイアウトクラススタンダードレイアウトクラスとは、以下の条件を満たすクラスです。
スタンダードレイアウト構造体は、クラスキーワード struct またはクラスキーワード class で定義されたスタンダードレイアウトクラスです。スタンダードレイアウト共用体は、クラスキーワード union で定義されたスタンダードレイアウトクラスです。 |
(C++11以降) |
[編集] 暗黙的生存期間クラス
暗黙的生存期間クラスとは、以下の条件を満たすクラスです。
注:暗黙的生存期間のプロパティは、欠陥報告 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 | すべてのコンストラクタが deletedとして定義されているクラスがトリビアルになり得た。 |
それは非トリビアルである。 |
| CWG 1672 | C++11 | 複数の空の基底クラスを持つ場合でも クラスはスタンダードレイアウトクラスになり得た。 |
それはスタンダードレイアウトクラスではない。 |
| CWG 1734 | C++11 | トリビアルにコピー可能なクラスは、非トリビアルな deleted指定されたコピー/ムーブコンストラクタ/代入演算子を持つことができなかった。 |
deletedされていればトリビアルになり得る。 |
| CWG 1813 | C++11 | 非静的データメンバを継承する基底クラスを持つ場合、 クラスは決してスタンダードレイアウトクラスにならなかった。 |
それはスタンダードレイアウトクラスになり得る。 |
| CWG 1881 | C++11 | スタンダードレイアウトクラスとその基底クラスについて、 無名ビットフィールドがデータメンバを宣言するクラスとは 異なるクラスで宣言される可能性があった。 |
すべての非静的データメンバ とビットフィールドは、最初に 同じクラスで宣言される必要がある。 |
| CWG 1909 | C++98 | メンバテンプレートがそのクラスと同じ名前を持つことができた。 | 禁止された |
| CWG 2120 | C++11 | スタンダードレイアウトクラスを決定する際のM(X)の定義が、 最初のメンバが配列であるクラスの ケースを考慮していなかった。 |
M(X)の定義で このケースに対応した。 |
| CWG 2605 | C++98 | 暗黙的生存期間クラスがユーザー提供のデストラクタを持つことができた。 | 禁止された |