Menu
CoddyTech

带参数的构造函数

本课属于 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);      // 调用第二个构造函数

参数可以有默认值,这样某些参数就可以省略。这减少了对多个重载构造函数的需求。

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

挑战

简单

我们来构建一个产品库存系统,了解带参数的构造函数如何让你创建具有特定初始值的对象,以及构造函数重载如何让对象的创建方式更加灵活。

你将创建两个文件来组织代码:

  • Product.h:定义一个表示库存商品的 Product 类。你的类应包含:
    • 用于 name(string)、price(double)和 quantity(integer)的私有属性
    • 一个接收全部三个参数(name、price、quantity),用于完整初始化产品的构造函数
    • 一个只接收 name 和 price 的构造函数,其中 quantity 默认为 1
    • 一个只接收 name 的构造函数,其中 price 默认为 0.0,quantity 默认为 0
    • 一个 display() 方法,按以下格式打印产品信息:"<name>: $<price> (x<quantity>)"
    • 一个 getTotalValue() 方法,返回 price 乘以 quantity 的结果
  • main.cpp:通过读取输入并以不同方式创建产品,演示全部三个构造函数。从输入中读取以下内容:
    • 第一行:产品名称、价格和数量(以空格分隔)
    • 第二行:产品名称和价格(以空格分隔)
    • 第三行:仅包含产品名称
    使用适合每项输入的构造函数创建三个 Product 对象,对每个对象调用 display(),然后按以下格式打印这三件产品的总价值:"Total inventory value: $<value>"

输出价格时,请显示两位小数。例如,如果你创建一件名为 "Laptop"、价格为 999.99、数量为 5 的产品,显示结果应为 "Laptop: $999.99 (x5)"。

在 main.cpp 中使用 #include "Product.h" 引入头文件。

亲手试试

#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"

using namespace std;

int main() {
    // 读取第一个商品的名称、价格和数量
    string name1;
    double price1;
    int quantity1;
    cin >> name1 >> price1 >> quantity1;
    
    // 读取第二个商品的名称和价格
    string name2;
    double price2;
    cin >> name2 >> price2;
    
    // 只读取第三个商品的名称
    string name3;
    cin >> name3;
    
    // TODO:使用合适的构造函数分别创建 3 个 Product 对象
    
    // TODO:对每个商品调用 display()
    
    // TODO:计算并输出库存总价值
    // 格式:“Total inventory value: $<value>”
    // 使用 fixed 和 setprecision(1) 保留一位小数
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C++ 在线编译器