C++ でオーバーロードされたコンストラクタ
この記事では、オーバーロードされたコンストラクターを C++ で実装する方法について説明します。
C++ でのコンストラクターの基本とコンストラクターのオーバーロード
コンストラクターは、クラスのオブジェクトを初期化するタスクを実行する C++ クラスの特別なメンバー関数です。コンストラクターには特別な名前がなく、直接呼び出すことはできませんが、特定のクラスが作成されるたびに、対応するコンストラクターが通常呼び出されます。ただし、クラス自体と同じ名前のコンストラクターを宣言します。C++ は、特定のスコープ内で同じ名前の複数の関数を定義する方法を提供するため、単一のクラスに対して複数のコンストラクターを定義することもできます。
関数のオーバーロードルールは、受け入れるパラメーターまたはタイプの数が異なる必要があるため、オーバーロードされたコンストラクターと同様に適用されることに注意してください。C++ はさまざまなタイプのコンストラクターを指定します。これらのコンストラクターには特定のユースケースが含まれることがよくありますが、その範囲が広いため、この記事ではこれらの詳細については詳しく説明しません。
次のサンプルコードでは、タイプ string
の 2つの private
データメンバーを含む Student
クラスが定義されています。これらのメンバーは、Student
クラスの新しいインスタンスを作成するときに初期化されることになっていますが、name
メンバーのみが必須であると仮定しましょう。したがって、このクラスのオブジェクトを構築するには、さまざまなメソッドが必要です。そのうちの 1つは、name
メンバーのみを初期化します。
したがって、1つの string
パラメーターのみを取り、対応するメッセージをコンソールに出力する最初のコンストラクターを定義します。後者のステップは、コンストラクターの動作を簡単に識別するためにのみ使用されます。さらに、2つの string
パラメーターを受け入れ、両方のデータメンバー(name
と last_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つのコンストラクターを定義できます。