Menu
CoddyTech

运算符重载简介

本课属于 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 都不能重载。此外,你不能创建新的运算符,也不能更改运算符的优先级,* 总是在 + 之前求值。

运算符可以实现为成员函数(如上所示),也可以实现为非成员函数。在接下来的课中,你将学习何时使用这两种方式,以及如何重载特定类别的运算符。

challenge icon

挑战

简单

我们来创建一个表示二维坐标的 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;
}
quiz icon自我测试

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

面向对象编程中的所有课

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