はじめに
C++のクラスからオブジェクトを作成する際、メンバ変数を一つずつ手動で設定するのは手間がかかり、また設定し忘れると、変数が不定な値(ごみデータ)のまま使われてしまう危険性があります。
このような初期化の手間とミスを防ぐために、C++には「コンストラクタ (Constructor)」という特別なメンバ関数が用意されています。コンストラクタは、オブジェクトが生成される瞬間に、自動的に呼び出されるように約束された関数です。
この記事では、コンストラクタの基本的な定義方法と、それを使ってオブジェクトの初期化を自動化するメリットについて解説します。
コンストラクタの定義ルール
コンストラクタには、通常のメンバ関数とは異なる、以下の2つの重要なルールがあります。
- 関数名は、クラス名と完全に同じでなければならない。
- 戻り値の型(
void
も含む)を記述してはならない。
コンストラクタを使ったサンプルコード
このコードは、Product
クラスにコンストラクタを定義し、オブジェクトが生成された時点で、各メンバ変数が自動的に初期値で設定される様子を示します。
完成コード
#include <iostream>
#include <string>
using namespace std;
class Product {
public:
// メンバ変数
int id;
string name;
int price;
// メンバ関数
void display();
// 1. コンストラクタの宣言
Product();
};
// メンバ関数の実装
void Product::display() {
cout << "商品ID: " << id << endl;
cout << "商品名: " << name << endl;
cout << "価格: " << price << "円" << endl;
}
// 2. コンストラクタの実装
Product::Product() {
cout << "--- コンストラクタが自動的に呼び出されました ---" << endl;
// メンバ変数の初期化処理
id = 0;
name = "(未設定)";
price = 0;
}
int main() {
// 3. オブジェクトを生成
// この瞬間に、Product() コンストラクタが自動で実行される
Product newItem;
// 4. メンバ関数を呼び出して、初期化されていることを確認
newItem.display();
return 0;
}
実行結果
--- コンストラクタが自動的に呼び出されました ---
商品ID: 0
商品名: (未設定)
価格: 0円
コードの解説
1. Product();
クラスの定義の中で、Product
という、クラス名と全く同じ名前のメンバ関数を宣言しています。これがコンストラクタの宣言です。戻り値の型がないことに注目してください。
2. Product::Product() { ... }
コンストラクタの実装部分です。ここでは、各メンバ変数に安全な初期値(0
や"(未設定)"
)を代入する処理を記述しています。
3. Product newItem;
main
関数の中で、Product
クラスのオブジェクト newItem
を生成しています。この行が実行された瞬間に、VBEが自動的にProduct
クラスのコンストラクタを探し出し、その中の初期化処理を実行します。開発者が明示的にコンストラクタを呼び出す必要はありません。
コンストラクタのメリット
コンストラクタを使うことで、オブジェクトが生成された時点で、必ず意図した初期状態になっていることが保証されます。これにより、初期化のし忘れによるバグを防ぎ、プログラム全体の安定性を大きく向上させることができます。これは、プログラミングの効率化に繋がる、オブジェクト指向の重要な考え方の一つです。
まとめ
今回は、C++のコンストラクタの基本的な役割と使い方について解説しました。
- コンストラクタは、オブジェクト生成時に自動で呼び出される特別なメンバ関数。
- クラス名と同じ名前で、戻り値の型は書かない、というルールで定義する。
- 主な目的は、メンバ変数を安全な初期値に設定すること。
コンストラクタを正しく使うことは、信頼性の高いクラスを設計するための第一歩です。