运算符重载允许为类类型定义操作符行为,提升代码可读性。可通过成员函数(如Complex的+)或全局友元函数(如<<输出)实现,前者隐含this指针,后者支持类型转换与非成员操作数。

在c++中,运算符重载是一种允许我们为自定义类型(如类或结构体)重新定义已有运算符行为的机制。通过它,我们可以让对象像基本数据类型一样使用+、-、==等操作符,提升代码可读性和自然性。
运算符重载的基本语法
运算符重载通过关键字operator加上要重载的符号来实现。它可以作为类的成员函数,也可以作为全局函数(友元函数)。基本格式如下:
返回类型 operator 运算符(参数列表) { // 实现逻辑 }
例如,重载+操作符实现两个对象相加:
class Complex { public: double real, imag; Complex(double r = 0, double i = 0) : real(r), imag(i) {} // 成员函数方式重载 + Complex operator+(const Complex& other) const { return Complex(real + other.real, imag + other.imag); } };
成员函数 vs 全局函数重载
选择哪种方式取决于运算符是否需要访问私有成员以及操作数的位置。
立即学习“C++免费学习笔记(深入)”;
- 成员函数重载:左侧操作数是当前对象(隐含this),适用于大多数二元运算符,如
+、-、=等。 - 全局函数重载:当需要将非成员类型(如int)放在左边,或左右操作数都需转换时更合适。常配合
friend使用以访问私有成员。
示例:用友元函数重载<<用于输出:
class Complex { // ... friend std::ostream& operator<<(std::ostream& os, const Complex& c); }; std::ostream& operator<<(std::ostream& os, const Complex& c) { os << c.real << " + " << c.imag << "i"; return os; }
常见可重载的运算符及注意事项
C++支持大多数运算符的重载,但有一些限制和最佳实践:
- 不能创建新的操作符(如
***) - 以下运算符不可重载:
.、.*、::、?:、sizeof - 建议保持语义一致性,比如
+应实现“相加”而非赋值 - 赋值运算符
=通常需手动定义以处理深拷贝 - 下标操作符
[]常用于容器类,返回引用以便读写
示例:重载[]实现数组式访问:
class MyArray { int data[10]; public: int& operator[](int index) { return data[index]; } };
特殊运算符的重载技巧
某些运算符有特定习惯写法,遵循这些能避免问题。
- 赋值运算符:应返回
*this,并检查自赋值 - 前置++/后置++:前置返回引用,后置多一个int参数作区分
- == 和 !=:通常只重载
==,!=可基于其定义
示例:前后置递增的区别:
// 前置++ Complex& operator++() { ++real; return *this; } // 后置++,int是占位符 Complex operator++(int) { Complex old = *this; ++real; return old; }
基本上就这些。掌握运算符重载能让类接口更直观,但不要滥用。保持操作符含义清晰,符合用户预期,才是良好设计的关键。


