' P '

whatever I will forget

C++ Constructor Initialization List, Delegating constructor

コンストラクターにも色々ありまして、、、
前回メモしたコンストラクタは、実はちゃんと初期化しているのか!?と言われるとそうでもない、と。
ただ値をアサインしているだけとも言える。
そのため、initialization listをメモ。これはコードも減らせるし、ナイスなもの。

例えば、下記のようなコンストラクタは、値を初期化しているとも言えるが、実は値をアサインしているもの。

//Constructor
Account::Account() {
    name = "";
    balance = 0;
}

では、initialization list を使ったコンストラク

//Constructor
Account::Account()
    : name {"None"}, balance {0} {
}

これだけです。

あとひとつTips的なものですが、もしクラス内のメンバ変数にStringがある場合。

class Account {
private:
    std::string name {"AAA"};
}

//Constructor
Account::Account()
    : name {"None"} {
}

Account peropero;

このような場合、実はperoperoオブジェクトが生成された時点で"AAA"が入るんですよね。
その後、コンストラクタにて"None"に初期化されます。
もしnameメンバ変数に何も初期化の値がない場合は、""ですでに初期化されています。

あとは実はコンストラクタってDelegating (代表)コンストラクさえ定義しておけばOKみたいな節もあります。

例えば、

class Account {
private:
    std::string name;
    int balance;
public:
    Account (std::string name = "None", int balance = 0 );
}

//Constructor
Account::Account(std::string name, int balance) 
    : name {std::string name, int balance}{
}

//creating object
Account peropero; // no args
Account chinchin("wtf"); // 1 args
Account manman("mange", 100) // 2 args

まあ、上記の場合、クラス内でメンバ変数の初期値がしっかりと決まっている場合というのはありますが、、
最大引数のコンストラクタを定義しておけば、
クラス内で初期化 -> コンストラクタで値が挿入 という流れになるので、例えば1 argsのchinchinのメンバ変数の値は、
name = "wtf" と balance = 0 になります。

まあ、色々やり方があるってことで消化しました..