目次
はじめに
C++のコンストラクタは、オブジェクトが生成される際に自動で呼び出され、メンバ変数の初期化を行います。通常の関数と同様に、この**コンストラクタもオーバーロード(overload)**することが可能です。
コンストラクタをオーバーロードすることで、オブジェクトを生成する方法を複数、柔軟に提供できます。例えば、
- 引数なしで呼べば、デフォルト値で初期化されたオブジェクトを作成。
- 引数を渡して呼べば、指定した初期値で初期化されたオブジェクトを作成。
といった使い分けが可能になります。この記事では、コンストラクタのオーバーロードの基本的な使い方と、そのメリットについて解説します。
コンストラクタをオーバーロードしたサンプルコード
このコードは、Book
クラスに2種類のコンストラクタを定義します。
- デフォルトコンストラクタ: 引数なしで呼び出され、各メンバを既定値で初期化します。
- 引数付きコンストラクタ: ID、タイトル、価格を引数として受け取り、それでメンバを初期化します。
完成コード
#include <iostream>
#include <string>
using namespace std;
class Book {
public:
// メンバ変数
int id;
string title;
int price;
// メンバ関数
void display();
// 1. デフォルトコンストラクタ(引数なし)
Book();
// 2. 引数付きコンストラクタ
Book(int newId, string newTitle, int newPrice);
};
// メンバ関数の実装
void Book::display() {
cout << "--- 書籍情報 ---" << endl;
cout << "ID: " << id << endl;
cout << "タイトル: " << title << endl;
cout << "価格: " << price << "円" << endl;
}
// デフォルトコンストラクタの実装
Book::Book() {
cout << "(デフォルトコンストラクタが呼ばれました)" << endl;
id = 0;
title = "未設定";
price = 0;
}
// 引数付きコンストラクタの実装
Book::Book(int newId, string newTitle, int newPrice) {
cout << "(引数付きコンストラクタが呼ばれました)" << endl;
id = newId;
title = newTitle;
price = newPrice;
}
int main() {
// 1. 引数なしでオブジェクトを生成 -> デフォルトコンストラクタが呼ばれる
Book bookA;
bookA.display();
cout << "\n";
// 2. 引数を指定してオブジェクトを生成 -> 引数付きコンストラクタが呼ばれる
Book bookB(101, "C++入門", 2800);
bookB.display();
return 0;
}
実行結果
(デフォルトコンストラクタが呼ばれました)
--- 書籍情報 ---
ID: 0
タイトル: 未設定
価格: 0円
(引数付きコンストラクタが呼ばれました)
--- 書籍情報 ---
ID: 101
タイトル: C++入門
価格: 2800円
コードの解説
コンストラクタのオーバーロード
Book
クラスの定義の中に、Book()
とBook(int, string, int)
という、同じ名前で引数リストが異なる2つのコンストラクタを宣言しています。これがコンストラクタのオーバーロードです。
呼び分けの仕組み
C++コンパイラは、オブジェクトを生成する際の引数の有無や型を見て、どちらのコンストラクタを呼び出すべきかを自動的に判断します。
Book bookA;
: オブジェクト名の後ろに引数がないため、引数なしのデフォルトコンストラクタBook()
が呼び出されます。Book bookB(101, "C++入門", 2800);
: オブジェクト名の後ろに(int, string, int)
に一致する引数が渡されているため、引数付きコンストラクタBook(int, string, int)
が呼び出されます。
まとめ
今回は、C++のコンストラクタをオーバーロードする方法について解説しました。
- 通常の関数と同様に、コンストラクタも引数リストを変えることでオーバーロードできる。
- オブジェクトを生成する際の引数の渡し方に応じて、適切なコンストラクタが自動的に呼び出される。
- これにより、オブジェクトの初期化方法を複数提供でき、クラスの柔軟性と利便性が向上する。
コンストラクタのオーバーロードは、使いやすく、かつ安全なクラスを設計するための基本的なテクニックです。