名前空間
変種
操作

クラス

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

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

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

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

1) データメンバ
2) メンバ関数
3) 入れ子にされた型 (nested types)
a) クラス定義内で定義される入れ子クラスおよび列挙体
b) typedef または型エイリアス(C++11以降)宣言で定義される、既存の型のエイリアス
c) クラス自身の定義内でのクラス名は、ルックアップの目的で、それ自身の公開メンバ型エイリアスとして機能します(コンストラクタを指名するために使用される場合を除く):これは注入されたクラス名 (injected-class-name)として知られています。
4) クラス内で定義されたすべてのスコープ無し列挙体の列挙子、またはusing宣言using-enum-declarationによって導入された列挙子(C++20以降)
5) メンバテンプレート変数テンプレート、(C++14以降)クラステンプレート、または関数テンプレート)は、ローカルでないクラス/構造体/共用体の本体に現れることがあります。

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

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

  • 静的データメンバ、
  • メンバ関数、
  • メンバ型、
  • メンバテンプレート、
  • 列挙体の列挙子(その列挙体がスコープ付きである場合を除く)(C++11以降)、または
  • メンバ無名共用体のメンバ。

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

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

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

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

(C++11以降)

目次

[編集] クラスのプロパティ

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

トリビアルにコピー可能なクラスとは、以下の条件を満たすクラスです。

トリビアルなクラス

トリビアルなクラスとは、以下の条件を満たすクラスです。

(C++26で非推奨)

スタンダードレイアウトクラス

スタンダードレイアウトクラスとは、以下の条件を満たすクラスです。

  • 非スタンダードレイアウトクラス(またはその配列)や参照型の非静的データメンバを持たない、
  • 仮想関数仮想基底クラスも持たない、
  • すべての非静的データメンバに対して同じアクセスコントロールを持つ、
  • 非スタンダードレイアウトの基底クラスを持たない、
  • 階層内のただ1つのクラスだけが非静的データメンバを持つ、そして
  • 非公式には、どの基底クラスも最初の非静的データメンバと同じ型を持たない。または、正式には:クラスをSとしたとき、Sの型M(S)の集合の要素を基底クラスとして持たない。ここで、型Xに対するM(X)は次のように定義される。
  • Xが、(おそらく継承された)非静的データメンバを持たない非共用体クラス型である場合、集合M(X)は空である。
  • Xが、最初の非静的データメンバの型がX0である非共用体クラス型である場合(当該メンバは無名共用体であってもよい)、集合M(X)はX0とM(X0)の要素から成る。
  • Xが共用体型である場合、集合M(X)はすべてのM(Ui)の和集合と、すべてのUiを含む集合である。ここで、各UiはXのi番目の非静的データメンバの型である。
  • Xが要素型Xeの配列型である場合、集合M(X)はXeとM(Xe)の要素から成る。
  • Xが非クラス、非配列型である場合、集合M(X)は空である。

スタンダードレイアウト構造体は、クラスキーワード struct またはクラスキーワード class で定義されたスタンダードレイアウトクラスです。スタンダードレイアウト共用体は、クラスキーワード union で定義されたスタンダードレイアウトクラスです。

(C++11以降)

[編集] 暗黙的生存期間クラス

暗黙的生存期間クラスとは、以下の条件を満たすクラスです。

  • デストラクタがユーザー宣言(C++11まで)ユーザー提供(C++11以降)でない集成体である、または
  • 少なくとも1つのトリビアルな適格コンストラクタと、トリビアルで削除されていないデストラクタを持つ。

注:暗黙的生存期間のプロパティは、欠陥報告 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 すべてのコンストラクタが
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 暗黙的生存期間クラスがユーザー提供のデストラクタを持つことができた。 禁止された
English 日本語 中文(简体) 中文(繁體)