【C++】コンストラクタのオーバーロード入門 | オブジェクトの作り方を複数用意する方法

目次

はじめに

C++のコンストラクタは、オブジェクトが生成される際に自動で呼び出され、メンバ変数の初期化を行います。通常の関数と同様に、この**コンストラクタもオーバーロード(overload)**することが可能です。

コンストラクタをオーバーロードすることで、オブジェクトを生成する方法を複数、柔軟に提供できます。例えば、

  • 引数なしで呼べば、デフォルト値で初期化されたオブジェクトを作成。
  • 引数を渡して呼べば、指定した初期値で初期化されたオブジェクトを作成。

といった使い分けが可能になります。この記事では、コンストラクタのオーバーロードの基本的な使い方と、そのメリットについて解説します。


コンストラクタをオーバーロードしたサンプルコード

このコードは、Bookクラスに2種類のコンストラクタを定義します。

  1. デフォルトコンストラクタ: 引数なしで呼び出され、各メンバを既定値で初期化します。
  2. 引数付きコンストラクタ: IDとタイトルを引数として受け取り、それでメンバを初期化します。

完成コード

#include <iostream>
#include <string>

using namespace std;

class Book {
public:
    // メンバ変数
    int id;
    string title;

    // メンバ関数
    void display();

    // 1. デフォルトコンストラクタ(引数なし)
    Book();
    
    // 2. 引数付きコンストラクタ
    Book(int bookId, string bookTitle);
};

// メンバ関数の実装
void Book::display() {
    cout << "--- 書籍情報 ---" << endl;
    cout << "ID: " << id << endl;
    cout << "タイトル: " << title << endl;
}

// デフォルトコンストラクタの実装
Book::Book() {
    cout << "(引数なしのコンストラクタが呼ばれました)" << endl;
    id = 0;
    title = "未設定";
}

// 引数付きコンストラクタの実装
Book::Book(int bookId, string bookTitle) {
    cout << "(引数付きコンストラクタが呼ばれました)" << endl;
    id = bookId;
    title = bookTitle;
}


int main() {
    cout << "--- オブジェクト1を生成 ---" << endl;
    Book bookA; // 引数なしでオブジェクトを生成 -> デフォルトコンストラクタが呼ばれる
    bookA.display();
    
    cout << "\n--- オブジェクト2を生成 ---" << endl;
    // 引数を指定してオブジェクトを生成 -> 引数付きコンストラクタが呼ばれる
    Book bookB(101, "C++入門");
    bookB.display();
    
    return 0;
}

実行結果

--- オブジェクト1を生成 ---
(引数なしのコンストラクタが呼ばれました)
--- 書籍情報 ---
ID: 0
タイトル: 未設定

--- オブジェクト2を生成 ---
(引数付きコンストラクタが呼ばれました)
--- 書籍情報 ---
ID: 101
タイトル: C++入門

コードの解説

コンストラクタのオーバーロード

Bookクラスの定義の中に、Book()Book(int, string)という、同じ名前で引数リストが異なる2つのコンストラクタを宣言しています。これがコンストラクタのオーバーロードです。

呼び分けの仕組み

C++コンパイラは、オブジェクトを生成する際の引数の有無や型を見て、どちらのコンストラクタを呼び出すべきかを自動的に判断します。

  • Book bookA;: オブジェクト名の後ろに引数がないため、引数なしのデフォルトコンストラクタ Book() が呼び出されます。
  • Book bookB(101, "C++入門");: オブジェクト名の後ろに (int, string) に一致する引数が渡されているため、引数付きコンストラクタ Book(int, string) が呼び出されます。

コンパイラが用意するデフォルトコンストラクタ

クラスにコンストラクタが一つも定義されていない場合、コンパイラは自動的に「引数なし、何も処理を行わない」空のデフォルトコンストラクタを用意します。しかし、一つでも引数付きのコンストラクタを自分で定義すると、コンパイラはデフォルトコンストラクタを自動では用意してくれません

そのため、引数付きコンストラクタを定義した上で、引数なしでのオブジェクト生成も許可したい場合は、Book() のように、引数なしのコンストラクタも明示的に自分で定義する必要があります。


まとめ

今回は、C++のコンストラクタをオーバーロードする方法について解説しました。

  • 通常の関数と同様に、コンストラクタも引数リストを変えることでオーバーロードできる。
  • オブジェクトを生成する際の引数の渡し方に応じて、適切なコンストラクタが自動的に呼び出される。
  • 自分で一つでもコンストラクタを定義すると、コンパイラはデフォルトコンストラクタを自動で用意してくれないため、注意が必要。

コンストラクタのオーバーロードは、使いやすく、かつ安全なクラスを設計するための基本的なテクニックです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次