1. C++运算符重载基础概念
在C++编程中,运算符重载(operator overloading)是一项强大的特性,它允许我们为自定义类型定义运算符的行为。就像给数学符号赋予新的含义,让它们能够操作我们创建的对象。这个特性使得代码更加直观和易读,特别是当我们处理自定义的数学向量、矩阵或其它复杂数据类型时。
运算符重载本质上是一种特殊的函数,使用operator关键字后跟要重载的运算符符号来定义。例如,operator+就是重载加法运算符的函数。编译器在遇到运算符时会查找对应的重载函数,这就像给编译器提供了一本"翻译字典",告诉它当遇到特定运算符和特定类型组合时应该如何解释。
重要提示:虽然可以重载大多数运算符,但有些运算符是不能重载的(如.、::、sizeof等),而有些运算符(如=、()、[]、->)必须作为成员函数重载。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 运算符重载的基本语法
2.1 成员函数形式的重载
当运算符重载作为类的成员函数时,它隐含地作用于当前对象。这种形式特别适合需要访问类私有成员的情况。让我们看一个简单的复数类示例:
cpp复制class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
// 成员函数形式重载+
Complex operator+(const Complex& rhs) const {
return Complex(real + rhs.real, imag + rhs.imag);
}
// 成员函数形式重载-=
Complex& operator-=(const Complex& rhs) {
real -= rhs.real;
imag -= rhs.imag;
return *this;
}
};
在这个例子中,operator+被定义为Complex类的成员函数。当编译器遇到c1 + c2这样的表达式时,实际上会转换为c1.operator+(c2)的调用。
2.2 友元函数形式的重载
有些运算符更适合作为非成员函数重载,特别是当左操作数不是类对象时。这时我们可以使用友元函数:
cpp复制class Complex {
// ... 其他成员同上 ...
// 声明为友元函数
friend Complex operator*(const Complex& lhs, const Complex& rhs);
};
// 友元函数实现
Complex operator*(const Complex& lhs, const Complex& rhs) {
return Complex(lhs.real * rhs.real - lhs.imag * rhs.imag,
lhs.real * rhs.imag + lhs.imag * rhs.real);
}
友元函数形式特别适合对称运算符(如+、*等)
