运算符重载简介
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 40 课,共 104 课。
运算符重载允许你定义运算符(如 +、- 或 ==)与自定义类一起使用时的行为。你可以写出更直观的 a + b,而不是调用 a.add(b) 这样的方法。
在 C++ 中,运算符本质上是具有特殊名称的函数。要重载运算符,你需要使用 operator 关键字,后面跟上符号,来定义一个函数:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// 重载 + 运算符
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};现在你可以自然地相加两个向量:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // 调用 v1.operator+(v2)并非所有运算符都可以重载。作用域解析运算符 ::、成员访问运算符 .、三元运算符 ?: 和 sizeof 都不能重载。此外,你不能创建新的运算符,也不能更改运算符的优先级,* 总是在 + 之前求值。
运算符可以实现为成员函数(如上所示),也可以实现为非成员函数。在接下来的课中,你将学习何时使用这两种方式,以及如何重载特定类别的运算符。
挑战
简单我们来创建一个表示二维坐标的 Point 类,并让它支持使用 + 运算符将两个点相加。这是你学习运算符重载的第一步,它可以让自定义类使用你熟悉的运算符。
你将创建两个文件来组织代码:
Point.h:定义一个用于存储 x 和 y 坐标(两者都是int)的Point类。这个类应包含:- 用于存储 x 和 y 坐标的私有成员
- 一个接收 x 和 y 值的构造函数
- Getter 函数
getX()和getY()(两者都是 const) - 一个重载的
+运算符,用于将两个点相加,并返回一个坐标合并后的新Point
+运算符应实现为成员函数,接收另一个Point的常量引用,并返回一个新的Point。将它标记为const,因为它不会修改任何一个操作数。main.cpp:从输入中读取 4 个整数(x1、y1、x2、y2,每个数单独占一行),它们表示两个点。创建两个Point对象,使用+运算符将它们相加,并显示结果。输出格式:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
这里的关键是,p1 + p2 实际上会在幕后调用 p1.operator+(p2)。重载运算符后,你就可以编写像 Point p3 = p1 + p2; 这样直观的代码,而不必写成 Point p3 = p1.add(p2);。
使用 std::stoi() 将输入字符串转换为整数。别忘了在头文件中添加头文件保护。
亲手试试
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// 读取输入
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: 使用输入值创建两个 Point 对象
// TODO: 使用 + 运算符将两个点相加
// TODO: 按要求的格式输出结果:
// Point 1: (<x1>, <y1>)
// Point 2: (<x2>, <y2>)
// Sum: (<sum_x>, <sum_y>)
return 0;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器