C++ では、初期化子(initializers)は変数やオブジェクトの初期状態を設定する式の一種であり、オブジェクトの作成、メンバーの初期化、配列の代入などのコンテキストでよく使用されます。
ダイレクト初期化#
ダイレクト初期化は()
または{}
を使用して変数を初期化することができます:
int a(10);
int b{10};
// メンバーの初期化式リストは、ダイレクト初期化の一種です
MyClass(int a, int b): x(a), y(b){
// 何かを行う..
}
ダイレクト初期化は明示的なコンストラクタを呼び出すことができます
コピー初期化#
コピー初期化はコピー代入演算子=
を使用し、ダイレクト初期化とは異なり、明示的なコンストラクタを呼び出すことはできません
int a = 10;
shared_ptr<int> p = new int(10); // エラー
リスト初期化#
リスト初期化は C++11 以降の新機能であり、波括弧{}
を使用して任意の型の変数を初期化することができます。これにより、縮小変換(つまり、一種の型から別の型への暗黙の変換による精度の損失など)を防ぐことができます: int x {4.2}
MyClass myClass = {1,2,3};
// または
MyClass myClass = new MyClass{1,2,3};
std::vector<int> v = {1,2,3};
集合 (struct) 初期化#
集合は、ユーザー定義のコンストラクタがなく、プライベートまたは保護された非静的データメンバーがなく、基本クラスも仮想関数もないクラスまたは構造体です
集合型の場合、波括弧を使用してそのメンバーを初期化することができます。例:
struct Point {int x; int y;};
Point p = {1, 2};
デフォルトメンバー初期化子#
デフォルトメンバー初期化子は、C++11 で導入された新機能であり、クラス定義内でメンバー変数にデフォルトの値を直接指定することができます
class MyClass{
int x = 4;
int y = 2;
public:
MyClass() = default; // デフォルトコンストラクタとデフォルトメンバー初期化子を使用して初期化
// 何かを行う..
}