第一节 · 机械臂的自我修养 · 初识重载运算符

C++ 允许我们为自定义类型定义运算符的行为,让自定义类型像内置类型一样使用。这就是运算符重载


为什么需要运算符重载

// 没有重载,复数加法很麻烦
struct Complex
{
    double real, imag;
};

Complex add(Complex a, Complex b)
{
    return {a.real + b.real, a.imag + b.imag};
}

Complex c1 = {1, 2}, c2 = {3, 4};
Complex c3 = add(c1, c2);  // 不直观

// 有了重载,可以写成
// Complex c3 = c1 + c2;  // 更自然

基本语法


可重载的运算符

类型
运算符

算术

+ - * / %

比较

== != < > <= >=

赋值

= += -= *= /=

位运算

& `

逻辑

! && `

其他

[] () -> * ++ --

不能重载的运算符. :: ?: sizeof


成员函数 vs 友元函数


算术运算符


复合赋值运算符


比较运算符


输入输出运算符


运算符重载的原则

  1. 保持直观性:重载的行为应符合预期

  2. 保持一致性:实现 + 也应实现 +=

  3. 返回合理类型:算术返回新对象,赋值返回引用

  4. 不要滥用:不要给运算符赋予不相关的含义


习题

  • Complex 类实现完整的算术运算符。

  • 实现一个 Fraction 分数类,支持四则运算。

  • 解释为什么 <<>> 要返回流引用。

Last updated