什么是运算符重载可能很多朋友不知道什么是运算符重载因此这不是所有语言都支持的特性。运算符一般来说是对基本数据类型进行操作而在面向对象语言中大量用到类对象是不能用原生运算符进行操作的。而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; } };
C++运算符重载的常见注意点
什么是运算符重载可能很多朋友不知道什么是运算符重载因此这不是所有语言都支持的特性。运算符一般来说是对基本数据类型进行操作而在面向对象语言中大量用到类对象是不能用原生运算符进行操作的。而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; } };