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

目次

はじめに

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

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

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

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


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

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

  1. デフォルトコンストラクタ: 引数なしで呼び出され、各メンバを既定値で初期化します。
  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++のコンストラクタをオーバーロードする方法について解説しました。

  • 通常の関数と同様に、コンストラクタも引数リストを変えることでオーバーロードできる。
  • オブジェクトを生成する際の引数の渡し方に応じて、適切なコンストラクタが自動的に呼び出される。
  • これにより、オブジェクトの初期化方法を複数提供でき、クラスの柔軟性と利便性が向上する。

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

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

この記事を書いた人

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

目次