运算符重载是C++中为自定义类型赋予运算符新含义的机制,通过定义如operator+、operator==等特殊函数实现。必须遵循已有运算符、至少一个操作数为用户类型、部分运算符需成员函数重载等规则。例如Complex类可重载+、==和<<,提升代码可读性。赋值运算符需处理自赋值、资源释放与深拷贝,推荐使用拷贝交换或RAII简化管理。
在C++
面向对象编程
中,操作符重载是一种让自定义类型(如类)能够像基本数据类型一样使用运算符的机制。通过重载,我们可以为类对象定义加法、赋值、比较等操作的行为,使代码更直观、易读。
什么是运算符重载
运算符重载允许我们为已有的运算符赋予新的含义,适用于用户自定义类型。比如,可以让两个
Point
对象通过
+
相加,或让
String
对象支持
==
比较。
重载的本质是编写一个特殊函数,函数名由
operator
关键字和运算符组成,例如
operator+
、
operator==
。
运算符重载的基本规则
重载运算符不是随意定义的,必须遵循一些语言规定的准则:
立即学习
“
C++免费学习笔记(深入)
”;
只能重载C++已有的运算符,不能创建新符号,如不能定义
***
或
@
以下运算符不能被重载:
.
(成员访问)、
.*
(成员指针访问)、
::
(
作用域
解析)、
?:
(三目条件)、
sizeof
重载运算符至少有一个操作数是用户自定义类型
部分运算符(如
=
、
()
、
[]
、
->
)必须作为类的成员函数重载
其他运算符可以作为成员函数或全局函数重载,通常建议对称操作(如+、==)用全局函数实现
常见运算符重载示例
以一个简单的
Complex
(复数)类为例,展示几种常用重载方式:
C函数速查手册(CHM版)
C函数速查手册(CHM版)
下载
};
// 定义全局比较操作
bool operator==(const Complex& a, const Complex& b) {
return a.real == b.real && a.imag == b.imag;
}
// 输出流重载
std::o
stream
& operator<<(std::ostream& os, const Complex& c) {
os << c.real << " + " << c.imag << "i";
return os;
}
这样就可以写出自然的表达式:
赋值运算符与拷贝控制
operator=
是特殊的重载函数,用于处理对象赋值。如果类管理资源(如动态内存),必须显式定义拷贝赋值运算符,否则编译器生成的默认版本可能引发浅拷贝问题。
良好的赋值重载应:
检查自赋值(
this == &other
)
释放原有资源
复制新数据
返回
*this
以支持链式赋值(如 a = b = c)
注意:
现代C++推荐使用“拷贝并交换”惯用法,或直接依赖RAII和智能指针来简化资源管理。
基本上就这些。只要理解规则,结合实际需求合理重载,就能写出清晰高效的类接口。
class Complex {
double real, imag;
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// 成员函数重载 +:this 在左侧
Complex operator+(const Complex& other) const {
return Complex(real + other.real, imag + other.imag);
}
// 全局函数重载 ==,需声明为友元
friend bool operator==(const Complex& a, const Complex& b);
// 重载输出流 <<,必须为全局函数
friend std::ostream& operator<<(std::ostream& os, const Complex& c);
Complex a(3, 4), b(1, 2);
Complex c = a + b;
if (a == b) { /* ... */ }
std::cout << c << std::endl;
