第二节 · 高级容器 · 类类型

在上一节中,我们学习了如何定义类。现在让我们更深入地了解类类型的一些特性——类作为一种自定义类型,可以像 intdouble 这样的内置类型一样使用。


类对象的创建

创建类对象有多种方式:

class Point
{
public:
    double x;
    double y;
};

int main()
{
    // 默认初始化
    Point p1;               // x 和 y 是未定义的值
    
    // 值初始化
    Point p2{};             // x 和 y 都是 0
    Point p3 = {};          // 同上
    
    // 列表初始化
    Point p4{1.0, 2.0};     // x = 1.0, y = 2.0
    Point p5 = {3.0, 4.0};  // x = 3.0, y = 4.0
    
    // 动态创建
    Point* p6 = new Point;          // 堆上创建
    Point* p7 = new Point{5.0, 6.0};
    
    delete p6;
    delete p7;
    
    return 0;
}

类的成员初始化

C++11 允许在类定义中直接为成员指定默认值:


类对象的赋值与复制

类对象可以像普通变量一样赋值和复制:

默认情况下,复制和赋值会逐成员复制。这种行为称为浅复制。如果类中有指针成员,可能需要自定义复制行为(深复制),我们将在后续章节学习。


类对象的比较

默认情况下,类对象不能直接用 == 比较:

可以通过重载运算符来支持比较,我们将在后续章节学习。


类作为函数参数和返回值

类对象可以作为函数的参数和返回值:


类数组和容器

类对象可以存储在数组和容器中:


嵌套类型

类可以作为另一个类的成员:


类类型的别名

可以使用 typedefusing 为类类型创建别名:


前向声明

有时我们需要在完整定义类之前就引用它,这时可以使用前向声明:

前向声明常用于解决循环引用的问题。


实例:学生成绩管理


类类型让我们能够创建更加复杂、更加贴近现实世界的数据模型。随着学习的深入,你会发现类是 C++ 最强大的特性之一。

习题

  • 设计一个 Time 类,包含时、分、秒,并编写一个函数计算两个时间之间的秒数差。

  • 设计一个 Book 类,包含书名、作者、价格。再设计一个 Library 类,使用 vector 存储多本书,提供添加书籍、查找书籍和显示所有书籍的功能。

Last updated