C++重载的奥义之运算符重载详解
什么是运算符重载
C++中的运算符重载指的是对语言中已有的运算符进行重新定义,使其能够支持自定义类型。
运算符重载的语法形式为:
返回类型 operator 运算符符号 (参数列表) {
//重载函数体
}
其中,operator
表示重载的运算符,符号必须包括在双引号中,如+
、-
、=
等等。
运算符重载的规则
在进行运算符重载时,需要注意以下几个规则:
- 无法重载的运算符:
.
、.*
、::
、?:
。 - 重载后的运算符优先级、参数个数、结合性均不可改变。
- 至少有一个参类型的定义类型为用户自定义类型。
- 代表运算符重载的函数必须被声明为类的成员函数或者是全局函数。
[]
、()
、->
、=
运算符只能重载为成员函数。
运算符重载的实现
成员函数实现
运算符重载可以通过成员函数实现,此时操作的对象为调用该函数的对象。下面以矩阵相加为例:
class Matrix {
public:
Matrix operator + (const Matrix& m) {
Matrix result;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
result.data[i][j] = data[i][j] + m.data[i][j];
}
}
return result;
}
int data[4][4];
};
在上述示例中,重载了+
运算符,将两个矩阵的每个元素相加并返回一个新的矩阵。
全局函数实现
运算符重载也可以通过全局函数实现,此时操作的对象为函数的参数。以复数相加为例:
class Complex {
public:
int real, imag;
};
Complex operator + (const Complex& a, const Complex& b) {
Complex result;
result.real = a.real + b.real;
result.imag = a.imag + b.imag;
return result;
}
在上述示例中,重载了+
运算符,将两个复数的实部和虚部分别相加,并返回一个新的复数。
运算符重载的应用场景
运算符重载可以让代码更简洁、易懂,同时也可以提高程序的执行效率。常见应用场景如下:
- 数组、矩阵等复杂数据结构的运算;
- 自定义类型的加减乘除等运算;
- 重载输入输出运算符实现对自定义类型的输入输出。
运算符重载的注意事项
在进行运算符重载时,需要注意以下事项:
- 不要过度使用运算符重载,以及避免产生二义性;
- 遵循常规语法和命名规范;
- 操作符重载的函数最好声明为const函数。
示例
示例1:重载加法运算符
class Person {
public:
int age;
Person operator + (const Person& p) {
Person result;
result.age = this->age + p.age;
return result;
}
};
int main()
{
Person a, b;
a.age = 20;
b.age = 30;
Person c = a + b;
cout << c.age << endl; //输出50
return 0;
}
示例2:重载小于运算符
class Person {
public:
int age;
bool operator < (const Person& p) const {
return this->age < p.age;
}
};
int main()
{
Person a, b;
a.age = 25;
b.age = 20;
cout << (a < b) << endl; //输出0,即a不小于b
return 0;
}
以上两个示例分别展示了重载+
和<
运算符的具体实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++重载的奥义之运算符重载详解 - Python技术站