默认构造函数
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 18 课,共 104 课。
默认构造函数是一种无需参数即可调用的构造函数。如果没有提供初始值,它会初始化对象。每个类都需要一种方法来创建处于有效默认状态的对象。
如果你没有定义任何构造函数,编译器会生成一个隐式默认构造函数。对于基本类型,它什么也不做;对于成员对象,它会调用默认构造函数。
class Player {
int health;
int score;
public:
Player() { // 默认构造函数
health = 100;
score = 0;
}
};
Player p1; // 调用默认构造函数
Player p2{}; // 也调用默认构造函数一旦你定义了任何构造函数(例如带参数的构造函数),编译器就不会再生成默认构造函数。如果你仍然需要默认构造函数,就必须显式定义它。
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // 只有带参数的构造函数
};
Enemy e1(10); // 可以正常运行
Enemy e2; // 错误!没有默认构造函数在现代 C++ 中,你可以使用 = default 显式请求编译器生成默认构造函数:
class Item {
int id;
public:
Item() = default; // 编译器会生成默认构造函数
Item(int i) : id(i) {}
};默认构造函数对于创建对象数组以及在 std::vector 这类容器中使用的类至关重要,因为这些容器可能需要在没有参数的情况下构造元素。
挑战
简单我们来构建一个简单的计数器系统,演示默认构造函数如何将对象初始化为有效的初始状态。
你需要创建两个文件来组织代码:
Counter.h:定义一个用于跟踪计数值的Counter类。这个类应包含:- 一个私有的
count属性(整数) - 一个私有的
name属性(字符串),用于标识计数器 - 一个默认构造函数,将
count初始化为0,将name初始化为"Unnamed",然后输出"Counter created: <name>" - 一个
increment()方法,将计数值加 1 - 一个
getCount()方法,返回当前计数值 - 一个
getName()方法,返回计数器的名称
- 一个私有的
main.cpp:演示以不同方式创建对象时,默认构造函数都能正常工作。从输入中读取一个数字,表示计数器需要递增的次数,然后:- 使用直接初始化创建一个 Counter:
Counter c1; - 使用花括号初始化再创建一个 Counter:
Counter c2{}; - 按照输入指定的次数递增
c1 - 输出 c1 的
"<name>: <count>" - 输出 c2 的
"<name>: <count>"
- 使用直接初始化创建一个 Counter:
由于默认构造函数的作用,两个计数器的初始值都应为 0,但只有 c1 会递增。这说明,无论对象以何种方式创建,默认构造函数都能确保每个对象从可预测且有效的状态开始。
在 main.cpp 中使用 #include "Counter.h" 引入头文件。
亲手试试
#include <iostream>
#include "Counter.h"
using namespace std;
int main() {
// 读取递增的次数
int n;
cin >> n;
// TODO:使用直接初始化创建一个 Counter:Counter c1;
// TODO:使用花括号初始化创建另一个 Counter:Counter c2{};
// TODO:将 c1 递增 n 指定的次数
// TODO:为 c1 打印 "<name>: <count>"
// TODO:为 c2 打印 "<name>: <count>"
return 0;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器