c++运算符重载的方法
1. 概述
c++具有运算符重载的特性,即为内置运算符重新定义操作,使其适用于特殊类型或类对象。通过运算符重载,程序员可以自定义操作符的行为,帮助编写更简洁和可读性更高的代码。
2. 运算符重载的基础
2.1 运算符重载函数
运算符重载函数是指在类定义外部定义的函数,名称是运算符关键字,然后跟上一组参数。运算符关键字位于函数名称前面,确定何时调用该特定函数。 例如,如果要重载“+”运算符,则可以编写以下代码:
class Complex {
public:
Complex( int r = 0, int i = 0 ) {
real = r;
imaginary = i;
}
Complex operator+(Complex const &obj) {
Complex res;
res.real = real + obj.real;
res.imaginary = imaginary + obj.imaginary;
return res;
}
private:
int real, imaginary;
};
该代码重载了“+”运算符,用于在两个复杂数对象中添加它们的实部和虚部。当语句:
Complex c3 = c1 + c2;
执行时,运算符“+”将通过调用上述函数进行重载。
2.2 运算符重载函数的调用方式
有两种方法可以调用重载运算符:
使用运算符重载函数的调用语法:operator运算符(参数)。
使用惯用法运算符:操作数运算符 操作数。
例如,下面是两个使用上述-运算符重载的不同调用方法:
Complex operator-() {
Complex temp;
temp.real = -real;
temp.imaginary = -imaginary;
return temp;
}
Complex C = -A; // 第一种方法
Complex C = A.operator-(); // 第二种方法
3. 运算符重载的类型
3.1 双目运算符重载
双目运算符重载指为两个操作数编写的函数重载,例如+, -, /, *, % 等运算符。在双目运算符重载函数中,第一个参数是通过使用运算符对象的类对象传递的,第二个参数是传递的参数。例如,下面是一个用于重载“+”运算符的代码:
Complex operator+(const Complex &c1, const Complex &c2) {
Complex c;
c.real = c1.real + c2.real;
c.imag = c1.imag + c2.imag;
return c;
}
3.2 单目运算符重载
单目运算符重载是用于单操作数的重载运算符。例如 - 运算符。在单目运算符重载函数中,只有一个参数,配合使用 operator 修饰符。例如:
Complex Complex::operator- () {
Complex temp;
temp.real = -real;
temp.imag = -imag;
return temp;
}
3.3 带参数运算符重载
带参数运算符重载的含义是特定的运算符可以具备多样的语义。可以看到,这种语法与函数调用的语法非常相似。奇妙之处在于可以使用操作符的效果来函数调用部分的语法。例如:
int operator()(int i)
{ return arr[i]; }
foo(10); // 调用operator()(10);
4. 运算符重载的一些限制和问题
4.1 无法新建运算符
在c++中没有办法创新的制运算符号。可以使用全局函授(非成员函数)来进行运算符号的使用,但有时需要对已有的运算符号进行其他类型的操作。
4.2 操作数数量和类型
默认情况下,运算符重载函数适用于指定的数据类型及其变量。如下所示的+= 以只对只针对MyInt类型进行操作。
const MyInt operator+ (const MyInt& lhs, const MyInt& rhs) {
MyInt ans = lhs;
ans += rhs;
return ans;
}
您也可以改变您想要操作的对象数目,使用参数或者方法来操作。
4.3 运算符的优先级和左结合性
运算符优先级和左结合性是不可更改的,如+和-默认具有相同的优先级,但是左结合性不同(即表达式x-y-z将被视为(x-y)-z或x-(y-z))。运算符重载不会改变运算符的优先级或左结合性,因此函数必须如下所示定义:
complex operator+(const complex& x, const complex& y)
{
return complex(x.real+y.real, x.imag+y.imag);
}
5. 结论
运算符重载一直是c++中的热门话题。本文讨论了如何在c++中设置运算符重载函数,函数的类型及调用方式以及运算符重载的约束和问题,对于刚刚接触c++的读者,本文将是一篇非常好的参考资料。