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; // デフォルトコンストラクタとデフォルトメンバー初期化子を使用して初期化
// 何かを行う..
}