Namespaces
Variants

Classes

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

クラスはユーザー定義型です。

クラス型は、クラス指定子によって定義され、これは 宣言 構文の decl-specifier-seq 内に現れます。クラス指定子の構文については、 class declaration を参照してください。

クラスは以下の種類のメンバを持つことができます:

1) データメンバ:
a) non-static data members 、これには bit-fields も含まれます。
2) メンバー関数:
3) ネスト型:
a) nested classes and enumerations クラス定義内で定義された
b) 既存の型のエイリアス、 typedef または 型エイリアス (C++11以降) 宣言で定義される
c) クラス自身の定義内でのクラス名は、 lookup の目的で自身のpublicメンバ型エイリアスとして機能する ( constructor の命名に使用される場合を除く)。これは injected-class-name として知られる
4) enumerators クラス内で定義されたすべての非スコープ列挙型からの列挙子 、または using-declarations または using-enum-declarations によって導入されたもの (C++20以降)
5) メンバーテンプレート ( 変数テンプレート、 (C++14以降) クラステンプレートまたは関数テンプレート) は、任意の非ローカルクラス/構造体/共用体の本体に現れることができます。

すべてのメンバーはクラス定義内で一度に定義され、既に定義されたクラスに追加することはできません(名前空間のメンバーとは異なります)

クラスのメンバが以下の場合、 T をその名前として使用することはできません:

  • 静的データメンバ、
  • メンバ関数、
  • メンバ型、
  • メンバテンプレート、
  • 列挙型の列挙子 (スコープ付き列挙型でない場合) (C++11以降) 、または
  • メンバ匿名共用体のメンバ。

ただし、ユーザー宣言されたコンストラクタが存在しない場合に限り、非静的データメンバーは T という名前を使用できます。

少なくとも1つの宣言済みまたは継承された virtual メンバ関数を持つクラスは ポリモーフィック です。この型のオブジェクトは ポリモーフィックオブジェクト であり、オブジェクト表現の一部として実行時型情報が格納されており、 dynamic_cast および typeid で問い合わせることができます。仮想メンバ関数は動的バインディングに参加します。

少なくとも1つの宣言済みまたは継承された純粋仮想メンバ関数を持つクラスは、 abstract class です。この型のオブジェクトは作成できません。

constexpr コンストラクタを持つクラスは LiteralType です:この型のオブジェクトはコンパイル時に constexpr 関数で操作できます。

(C++11以降)

目次

クラスのプロパティ

トリビアルコピー可能クラス

トリビアルコピー可能クラス は以下の条件を満たすクラスである:

トリビアルクラス

トリビアルクラス は以下の条件を満たすクラスである:

(C++26で非推奨)

標準レイアウトクラス

標準レイアウトクラス は以下の条件を満たすクラスである:

  • 非標準レイアウトクラス型(またはそのような型の配列)または参照型の non-static data members を持たない
  • virtual functions および virtual base classes を持たない
  • すべてのnon-static data membersが同じ access control を持つ
  • 非標準レイアウトの基底クラスを持たない
  • 階層内の1つのクラスのみがnon-static data membersを持つ
  • 非公式には、基底クラスが最初のnon-static data memberと同じ型を持たない。または公式には:クラスをSとしたとき、型の集合M(S)の要素を基底クラスとして持たない。ここで型Xに対するM(X)は以下のように定義される:
  • Xが(継承されたものを含む)non-static data membersを持たない非共用体型の場合、集合M(X)は空である
  • Xが最初のnon-static data memberの型をX0(そのメンバーは無名共用体でもよい)とする非共用体型の場合、集合M(X)はX0とM(X0)の要素からなる
  • Xが共用体型の場合、集合M(X)はすべてのM(Ui)とすべてのUiを含む集合の和集合である。ここで各UiはXのi番目のnon-static data memberの型である
  • Xが要素型Xeを持つ配列型の場合、集合M(X)はXeとM(Xe)の要素からなる
  • Xが非クラス型かつ非配列型の場合、集合M(X)は空である

標準レイアウト構造体 はクラスキーワード 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クラス型(またはその配列)または参照の非静的データメンバーを持たない。
(C++11まで)
  • トリビアルクラスであり、
  • スタンダードレイアウトクラスであり、
  • 非PODクラス型(またはその配列)の非静的データメンバーを持たない。
(C++11以降)

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 暗黙の生存期間クラスはユーザー提供のデストラクタを持つことができた 禁止