目次
はじめに
C++のコンストラクタは、オブジェクトの初期化を自動化する強力な機能ですが、その応用テクニックを学ぶことで、さらにコードを簡潔で柔軟にすることができます。
この記事では、コンストラクタの応用として、以下の2つの重要なテクニックを解説します。
- オブジェクトの配列を、コンストラクタを使って初期化する方法
- デフォルト引数を使って、複数のコンストラクタを一つにまとめる方法
1. オブジェクトの配列を初期化する
クラスの配列を宣言する際に、初期化子リスト {}
の中で各要素に対応するコンストラクタを呼び出すことで、配列の全オブジェクトを一度に初期化できます。
サンプルコード
#include <iostream>
#include <string>
using namespace std;
class Pet {
public:
string name;
// デフォルトコンストラクタ
Pet() : name("(名前なし)") {
cout << "ペット(引数なし)が生成されました。" << endl;
}
// 引数付きコンストラクタ
Pet(string n) : name(n) {
cout << "ペット「" << name << "」が生成されました。" << endl;
}
};
int main() {
cout << "--- ペットの配列を作成します ---" << endl;
Pet myPets[3] = {
Pet(), // 1番目の要素は、デフォルトコンストラクタで初期化
Pet("ポチ"), // 2番目の要素は、引数付きコンストラクタで初期化
Pet("タマ") // 3番目の要素も、引数付きコンストラクタで初期化
};
cout << "\n--- うちのペットたち ---" << endl;
for(int i = 0; i < 3; i++) {
cout << myPets[i].name << endl;
}
return 0;
}
解説
Pet myPets[3] = { ... };
:Pet
クラスのオブジェクトを3つ持つ配列myPets
を宣言し、同時に初期化しています。Pet(), Pet("ポチ"), ...
: 初期化子リスト{}
の中で、各配列要素に対して呼び出したいコンストラクタを明示的に記述します。Pet()
は引数なしのデフォルトコンストラクタを、Pet("ポチ")
は引数付きのコンストラクタをそれぞれ呼び出します。
注意: オブジェクトの配列を初期化せずに Pet myPets[3];
のように宣言した場合、全ての要素に対してデフォルトコンストラクタが自動的に呼び出されます。そのため、配列で扱うクラスには、原則としてデフォルトコンストラクタを用意しておく必要があります。
2. コンストラクタでデフォルト引数を利用する
複数のコンストラクタをオーバーロードする代わりに、引数にデフォルト値を設定することで、一つのコンストラクタで複数の初期化パターンに対応できます。
サンプルコード
#include <iostream>
#include <string>
using namespace std;
class Book {
public:
int id;
string title;
// デフォルト引数を持つコンストラクタ
Book(int bookId = 0, string bookTitle = "(タイトル未設定)") {
id = bookId;
title = bookTitle;
cout << "コンストラクタが呼ばれました。" << endl;
}
};
int main() {
// パターン1: 引数を全く渡さない -> デフォルト値 (0, "(タイトル未設定)") が使われる
Book bookA;
// パターン2: 最初の引数だけ渡す -> 2番目の引数はデフォルト値が使われる
Book bookB(101);
// パターン3: 全ての引数を渡す -> デフォルト値は使われない
Book bookC(202, "C++入門");
cout << "\n--- 書籍情報 ---" << endl;
cout << "BookA: ID=" << bookA.id << ", Title=" << bookA.title << endl;
cout << "BookB: ID=" << bookB.id << ", Title=" << bookB.title << endl;
cout << "BookC: ID=" << bookC.id << ", Title=" << bookC.title << endl;
return 0;
}
解説
Book(int bookId = 0, string bookTitle = "(タイトル未設定)")
- コンストラクタの引数宣言で、
= 値
の形でデフォルト値を設定しています。 main
関数でオブジェクトを生成する際、渡されなかった引数については、このデフォルト値が自動的に使われます。Book bookA;
では引数が両方とも渡されなかったため、id
は0
、title
は"(タイトル未設定)"
で初期化されます。Book bookB(101);
ではbookId
に101
が渡されますが、bookTitle
は渡されなかったため、デフォルト値が使われます。
この方法を使えば、引数なしのコンストラクタと引数付きのコンストラクタを、たった一つの定義でまかなうことができ、コードが非常に簡潔になります。
まとめ
今回は、C++コンストラクタの2つの応用的な使い方を解説しました。
- オブジェクトの配列は、初期化子リスト
{}
を使って、各要素のコンストラクタを個別に呼び出せる。 - デフォルト引数をコンストラクタに設定することで、複数のオーバーロードされたコンストラクタを一つにまとめることができる。
これらのテクニックを使いこなすことで、オブジェクトの生成をより柔軟に行い、コードの冗長性を減らすことができます。