第11章 使用类
探索C++类的更多魔法!学习如何让自定义对象使用`+`、`*`等运算符,并掌握类与基本类型之间灵活转换的技巧。
环节 1:运算符重载 —— 让对象做算术
为什么 `int` 可以相加,而我们自己创建的 `Time` 对象却不行?运算符重载就是给 `+`、`-` 等符号赋予新的能力,让它们也能理解我们的自定义对象。
时间计算器 🕰️
输入两个时间,然后点击 `+` 按钮,看看重载后的运算符如何工作。
时间 T1
:时间 T2
:> 等待计算...
环节 2:友元函数 —— 类的“好帮手”
想让 `cout` 直接打印我们的 `Time` 对象(`cout << t1`),但 `cout` 并不是 `Time` 类的成员,无法访问其私有数据。这时就需要**友元 (friend)**,它像一个被授权的“好帮手”,可以自由进出类的“私有房间”。
自定义对象打印机 🖨️
我们有一个 `Time` 对象,它包含 `2` 小时和 `50` 分钟。点击按钮,使用重载的 `<<` 友元函数将其打印到控制台。
Time myTime(2, 50);
> Console Output:
环节 3:类型转换的艺术
C++有时会“偷偷地”帮你转换类型,但这可能导致意外。使用 `explicit` 关键字可以禁止这种“自动翻译”,让代码更安全、更可控。
严格的类型检查员 👮
`display` 函数只接受 `Stonewt` 类型的参数。尝试将一个 `double` 值传递给它,看看会发生什么。
函数原型: `void display(Stonewt st);`
终点站:编程挑战
练习 1:时间类减法与输出
任务:
基于 `Time` 类(包含小时和分钟),实现减法运算符 `-`,并确保 `Time` 对象可以被 `cout` 正常输出。
预期知识点:
成员函数重载,友元函数重载 `<<`。
点击查看参考答案
File 1: time.h (简化)
File 2: time.cpp (简化)
练习 2:Stonewt 转换
任务:
定义 `Stonewt` 类。提供 `explicit` 构造函数和 `operator double()` 转换函数。测试隐式转换是否被禁用,并测试显式转换。
预期知识点:
`explicit` 关键字,转换函数 `operator typeName()`。
点击查看参考答案
File 1: stonewt.h
File 2: stonewt.cpp
File 3: use_stonewt.cpp