第一节 · 机械臂的自我修养 · 初识重载运算符
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 友元函数
算术运算符
复合赋值运算符
比较运算符
输入输出运算符
运算符重载的原则
保持直观性:重载的行为应符合预期
保持一致性:实现
+也应实现+=返回合理类型:算术返回新对象,赋值返回引用
不要滥用:不要给运算符赋予不相关的含义
习题
为
Complex类实现完整的算术运算符。实现一个
Fraction分数类,支持四则运算。解释为什么
<<和>>要返回流引用。
Last updated