C++ でオーバーロードされたコンストラクタ

胡金庫 2023年10月12日
C++ でオーバーロードされたコンストラクタ

この記事では、オーバーロードされたコンストラクターを C++ で実装する方法について説明します。

C++ でのコンストラクターの基本とコンストラクターのオーバーロード

コンストラクターは、クラスのオブジェクトを初期化するタスクを実行する C++ クラスの特別なメンバー関数です。コンストラクターには特別な名前がなく、直接呼び出すことはできませんが、特定のクラスが作成されるたびに、対応するコンストラクターが通常呼び出されます。ただし、クラス自体と同じ名前のコンストラクターを宣言します。C++ は、特定のスコープ内で同じ名前の複数の関数を定義する方法を提供するため、単一のクラスに対して複数のコンストラクターを定義することもできます。

関数のオーバーロードルールは、受け入れるパラメーターまたはタイプの数が異なる必要があるため、オーバーロードされたコンストラクターと同様に適用されることに注意してください。C++ はさまざまなタイプのコンストラクターを指定します。これらのコンストラクターには特定のユースケースが含まれることがよくありますが、その範囲が広いため、この記事ではこれらの詳細については詳しく説明しません。

次のサンプルコードでは、タイプ string の 2つの private データメンバーを含む Student クラスが定義されています。これらのメンバーは、Student クラスの新しいインスタンスを作成するときに初期化されることになっていますが、name メンバーのみが必須であると仮定しましょう。したがって、このクラスのオブジェクトを構築するには、さまざまなメソッドが必要です。そのうちの 1つは、name メンバーのみを初期化します。

したがって、1つの string パラメーターのみを取り、対応するメッセージをコンソールに出力する最初のコンストラクターを定義します。後者のステップは、コンストラクターの動作を簡単に識別するためにのみ使用されます。さらに、2つの string パラメーターを受け入れ、両方のデータメンバー(namelast_name)を初期化する 2 番目のコンストラクターも定義します。

#include <iostream>

using std::cout;
using std::endl;
using std::string;

class Student {
 private:
  string name;
  string last_name;

 public:
  explicit Student(string n) : name(std::move(n)) {
    cout << "Constructor 1 is called" << endl;
  };
  Student(string &n, string &ln) : name(n), last_name(ln) {
    cout << "Constructor 2 is called" << endl;
  };

  string getName() { return name; }

  string getLastName() { return last_name; }
};

int main() {
  string n1("James");
  string n2("Kale");

  Student s1(n1, n2);
  cout << s1.getName() << endl;
  cout << s1.getLastName() << endl;
  cout << "------------------" << endl;

  Student s2(n1);
  cout << s2.getName() << endl;
  cout << s2.getLastName() << endl;
  cout << "------------------" << endl;

  return EXIT_SUCCESS;
}

出力:

Constructor 2 is called
James
Kale
------------------
Constructor 1 is called
James

------------------

main プログラムで s1 オブジェクトを作成すると、2つの引数を指定したため、2 番目のコンストラクターが呼び出され、s2 が初期化されると、最初のコンストラクターが呼び出されることに注意してください。この場合、パラメーターの数が異なる 2つのコンストラクターがありましたが、一般に、受け入れるタイプが異なる同じ数のパラメーターを持つ 2つのコンストラクターを定義できます。

著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Class