c++运算符重载的方法有哪些

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++的读者,本文将是一篇非常好的参考资料。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签