名前空間
変種
操作

クラス

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

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

クラス型は、宣言decl-specifier-seq 内に現れる、 class 指定子によって定義されます。 class 指定子は以下の構文を持ちます。

class-key attr class-head-name { member-specification } (1)
class-key attr class-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 - アクセス指定子、メンバオブジェクトおよびメンバ関数の宣言および定義 (クラスの定義を参照してください)

クラスキー structclass は、以下の点を除き、 C++ では区別されません。 クラスの宣言で struct クラスキーを使用した場合はデフォルトのアクセスモードおよびデフォルトの継承モードpublic となり、クラスの宣言で class クラスキーを使用した場合は private になります。 classstruct はどちらもクラスの定義で使用できます。

クラスキー union を使用すると、共用体の定義になり、一度にそのデータメンバのいずれかひとつのみを保持できるクラスを定義します。

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

a) 非静的データメンバ (ビットフィールドを含む)
b) 静的データメンバ
2) メンバ関数
b) 静的メンバ関数
3) ネストした型
a) クラス定義内で定義されるネストしたクラスおよび列挙
b) typedef または型エイリアス宣言を用いて定義される既存の型のエイリアス
c) 自身の定義内で、そのクラスの名前は、名前探索の目的で、自分自身のパブリックなメンバ型エイリアスとして振る舞います (コンストラクタを表すために使用されるときを除きます)。 これは注入されたクラス名と呼ばれます。
4) クラス内で定義されたすべてのスコープなし列挙の列挙子
5) メンバテンプレート (変数テンプレート、 (C++14およびそれ以降)クラステンプレート、関数テンプレート) は任意の非ローカルなクラス、構造体、共用体の本体の中に現れることができます

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

クラス T のメンバは、そのメンバが静的データメンバ、メンバ関数、メンバ型、メンバテンプレート 、スコープなし列挙の列挙子、メンバ無名共用体のメンバである場合、その名前として T を使用することはできません。 しかし、非静的データメンバは、ユーザ宣言されたコンストラクタが存在しない限り、名前 T を使用することができます。

少なくともひとつの仮想メンバ関数を宣言または継承するクラスは多相です。 この型のオブジェクトは多相オブジェクトであり、オブジェクト表現の一部として格納される実行時型情報を持ち、 dynamic_cast および typeid を用いてそれを問い合わせることができます。 仮想メンバ関数は動的束縛に参加します。

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

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

いくつかのメンバ関数は特別です。 これらは、特定の状況においては、ユーザによって定義されない場合でも、コンパイラによって定義されます。 これらには以下のものがあります。