導入
前レッスンではコンストラクタ本体で name = n; と代入しました。C++ には、それより望ましい「メンバ初期化リスト」という書き方があります。実務のコードでは圧倒的にこちらが使われます。
説明
コンストラクタの ) の後ろに : メンバ(値), メンバ(値) と書くのが初期化リストです。「代入」ではなく「初期化」なので、const メンバや参照メンバも初期化でき、無駄が少なくなります。
flowchart TB
a["本体で代入:<br/>Dog(string n) { name = n; }<br/>いったん既定構築してから代入"]
b["初期化リスト:<br/>Dog(string n) : name(n) {}<br/>最初から n で構築(推奨)"]
a -->|"より効率的・const も可"| b
#include <iostream>
#include <string>
using namespace std;
class Circle {
private:
const double pi; // const メンバは初期化リストでしか初期化できない
double radius;
public:
Circle(double r) : pi(3.14159), radius(r) {} // 初期化リスト
double area() { return pi * radius * radius; }
};
int main() {
Circle c(2.0);
cout << c.area() << endl; // 12.5664
return 0;
}
メンバにデフォルト値を書いておくと、コンストラクタで触れなかったメンバはその値になります。組み合わせると初期化がすっきりします。
#include <iostream>
#include <string>
using namespace std;
class User {
public:
string name;
int level = 1; // 既定値(触らなければ 1)
User(string n) : name(n) {} // level は既定の 1 のまま
};
int main() {
User u("たろう");
cout << u.name << " Lv." << u.level << endl; // たろう Lv.1
return 0;
}
まとめ
コンストラクタでは「本体で代入」より「初期化リスト : メンバ(値)」を優先します。const メンバや参照メンバはこれでしか初期化できません。メンバのデフォルト値と組み合わせると、意図が明確で効率的なコードになります。