带参数的构造函数
本课属于 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还记得上一课的内容吗?一旦定义了带参数的构造函数,编译器就不会再自动生成默认构造函数。如果两种构造函数你都需要,就必须显式定义默认构造函数。
挑战
简单我们来构建一个产品库存系统,了解带参数的构造函数如何让你创建具有特定初始值的对象,以及构造函数重载如何让对象的创建方式更加灵活。
你将创建两个文件来组织代码:
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:通过读取输入并以不同方式创建产品,演示全部三个构造函数。从输入中读取以下内容:- 第一行:产品名称、价格和数量(以空格分隔)
- 第二行:产品名称和价格(以空格分隔)
- 第三行:仅包含产品名称
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;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器