Menu
Coddy logo textTech

引数付きコンストラクタ

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 に設定されます

前のレッスンで学んだことを思い出してください。パラメータ化されたコンストラクタを一度定義すると、コンパイラはデフォルトコンストラクタを自動的に生成しなくなります。両方が必要な場合は、デフォルトコンストラクタを明示的に定義する必要があります。

challenge icon

チャレンジ

簡単

パラメータ化されたコンストラクタを使用して特定の初期値を持つオブジェクトを作成する方法と、コンストラクタのオーバーロードがオブジェクト作成にどのように柔軟性をもたらすかを実証する、製品在庫システムを構築しましょう。

コードを整理するために、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行目:製品名のみ
    各入力に対して適切なコンストラクタを使用して3つの Product オブジェクトを作成し、それぞれに対して 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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン