Menu
CoddyTech

默认构造函数

本课属于 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 这类容器中使用的类至关重要,因为这些容器可能需要在没有参数的情况下构造元素。

challenge icon

挑战

简单

我们来构建一个简单的计数器系统,演示默认构造函数如何将对象初始化为有效的初始状态。

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

  • 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>"

由于默认构造函数的作用,两个计数器的初始值都应为 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;
}
quiz icon自我测试

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

面向对象编程中的所有课

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