引数付きコンストラクタ
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 19/104。
引数付きコンストラクタは、オブジェクトの生成時に特定の値で初期化できるように引数を受け取ります。デフォルト値に頼るのではなく、各オブジェクトの初期状態をカスタマイズすることができます。
class Player {
std::string name;
int health;
int level;
public:
Player(std::string n, int h, int lvl) {
name = n;
health = h;
level = lvl;
}
};
Player hero("Archer", 100, 5);
Player mage("Wizard", 80, 7);異なる引数リストを持つ複数の引数付きコンストラクタを定義できます。これはコンストラクタのオーバーロードと呼ばれ、コンパイラは渡された引数に基づいて適切なものを選択します。
class Rectangle {
int width, height;
public:
Rectangle(int side) { // 正方形
width = height = side;
}
Rectangle(int w, int h) { // 長方形
width = w;
height = h;
}
};
Rectangle square(10); // 最初のコンストラクタを呼び出す
Rectangle rect(10, 20); // 2番目のコンストラクタを呼び出すパラメータはデフォルト値を持つことができ、一部の引数をオプションにすることができます。これにより、複数のオーバーロードされたコンストラクタの必要性が減ります。
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // damage はデフォルトで 10 になります
Enemy dragon("Dragon", 50); // damage は 50 に設定されます前のレッスンで学んだことを思い出してください。パラメータ化されたコンストラクタを一度定義すると、コンパイラはデフォルトコンストラクタを自動的に生成しなくなります。両方が必要な場合は、デフォルトコンストラクタを明示的に定義する必要があります。
チャレンジ
簡単パラメータ化されたコンストラクタを使用して特定の初期値を持つオブジェクトを作成する方法と、コンストラクタのオーバーロードがオブジェクト作成にどのように柔軟性をもたらすかを実証する、製品在庫システムを構築しましょう。
コードを整理するために、2つのファイルを作成します。
Product.h: 在庫内のアイテムを表すProductクラスを定義します。クラスには以下を含める必要があります。name(string)、price(double)、quantity(integer) のためのプライベート属性- 製品を完全に初期化するために、3つのパラメータ(name, price, quantity)すべてを受け取るコンストラクタ
- name と price のみを受け取り、quantity のデフォルト値を
1とするコンストラクタ - name のみを受け取り、price のデフォルト値を
0.0、quantity のデフォルト値を0とするコンストラクタ - 製品情報を
"<name>: "<name>: $<price> (x<quantity>)"lt;price> (x<quantity>)"の形式で出力するdisplay()メソッド - 価格に数量を掛けた値を返す
getTotalValue()メソッド
main.cpp: 入力を読み取り、異なる方法で製品を作成することで、3つすべてのコンストラクタを実証します。入力から以下を読み取ります。- 1行目:製品名、価格、数量(スペース区切り)
- 2行目:製品名、価格(スペース区切り)
- 3行目:製品名のみ
display()を呼び出します。その後、3つの製品すべての合計値を"Total inventory value: "Total inventory value: $<value>"lt;value>"の形式で出力します。
価格の出力については、小数点以下2桁まで表示してください。例えば、価格 999.99、数量 5 の製品 "Laptop" を作成した場合、表示は "Laptop: $999.99 (x5)" となるはずです。
main.cpp で #include "Product.h" を使用してヘッダーファイルをインクルードしてください。
自分で試してみよう
#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// 1つ目の製品を読み込む:名前、価格、数量
string name1;
double price1;
int quantity1;
cin >> name1 >> price1 >> quantity1;
// 2つ目の製品を読み込む:名前、価格
string name2;
double price2;
cin >> name2 >> price2;
// 3つ目の製品を読み込む:名前のみ
string name3;
cin >> name3;
// TODO: それぞれに適切なコンストラクタを使用して、3つのProductオブジェクトを作成する
// TODO: 各製品に対してdisplay()を呼び出す
// TODO: 在庫の総額を計算して表示する
// 形式: "Total inventory value: $<value>"
// 小数点以下1桁を表示するために、fixedとsetprecision(1)を使用する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス