什么是运算符重载?
可能很多朋友不知道什么是运算符重载,因此这不是所有语言都支持的特性。
运算符一般来说是对基本数据类型进行操作,而在面向对象语言中大量用到类对象,是不能用原生运算符进行操作的。
而C++中支持了运算符的重载,其本质是一种特殊函数的调用。

常见注意点
避免全局重载和成员重载的二义性
虽然运算符重载的本质是函数的调用,但大家还是更加希望像普通运算符一样使用。
因此请避免全局重载和成员重载的二义性。
class Node {
public:
int x;
Node(int x) : x(x) {
}
public:
Node& operator+=(const Node& rhs) {
this->x += rhs.x;
return *this;
}
};
Node& operator+=(Node& lhs, const Node& rhs) {
lhs.x += rhs.x;
return lhs;
}
int main() {
Node a(10);
Node b(20);
// ok
a.operator+=(b);
// ok
operator+=(a, b);
// error
保持与原运算符的行为一致
本条注意点可以说是最重要,最本质的一条建议。
绝大多数的建议几乎都可以回归到本条。
区分前置递增和后置递增
i++ 和 ++i 在学习语言的初阶段是必然会学到的一个知识点。很多人对此是又痛又恨。
C++ 在中用一个参数来区分前置和后置的区别。同时注意前置和后置返回的区别。
-
前置 返回引用
-
后置 返回副本
class Node {
public:
int x;
Node(int x) : x(x) {
}public:
// 前置递增
// 返回引用
Node& operator++() {
++this->x;
return *this;
}// 后置递增 // 返回副本 添加占位符参数 const Node operator++(int) { const auto copy = *this; // 调用前置递增 ++(*this); // 返回原状态副本 return copy; }};