C++之运算符重载

C++运算符重载(overloading)

1.问题需求

为了根据自己的需要对C++已提供的运算符进行重载,赋予他们新的含义,使之一名多用。

2.运算符重载

运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新的功能。在使用被重载的运算符时,系统就会自动调用该函数,以实现相应的功能。

运算符重载实质上就是函数重载。

运算符重载的格式:

返回值类型 operator运算符名称(形参表){重载处理};

注意:

函数名是由operator和运算符组成的

eg:

Complex operator+(const Complex &a);

如何调用重载运算符:

对象1 运算符 对象2
eg:a+b

编译器如何区分时运算符重载还是运算符的基本功能:

编译器需要检查表达式的上下文,看运算符两侧数据的数据类型,来决定是否重载

3.重载运算符的规则

1.c++不允许用户自己定义新的运算符,只能对已有的运算符进行重载。

2.c++中不允许重载的运算符

. 成员访问运算符
* 成员指针访问运算符
:: 域运算符
sizeof 长度运算符
?: 条件运算符

"."和"*"不能重载是为了保证访问成员的功能不能被改变

"::"和"sizeof"运算符的运算对象是类型而不是变量或一般表达式,不具备重载的特征。
3.重载不能改变运算符运算对象(即操作数)的个数。

4.重载不能改变运算符的优先级别。

5.重载不能改变运算符的结合性。

6.重载运算符的函数不能带有默认的参数

7.重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或对类对象的引用) --- 参数不能全是C++的标准类型

这样做是为了防止修改C++标准类型的运算符。

8.用于类对象的运算符一般必须重载,但有两个例外,运算符"=''和"&"不必用户重载。

1."="运算符被编译器用于对象复制的重载
2."&"运算符也不需要重载,他被重载为返回类对象在内存中的起始地址。

4.运算符重载函数的处理方式 【重点】

1.放在类中做成员函数

2.运算符重载的函数不是类的成员函数(可以是一个普通函数),在类中把他声明为友元函数。--- 友元重载运算函数

友元函数和成员函数重载运算符的区别 -- 但必须得有一个对象参数

1.友元函数参数个数就是运算符的操作数的个数,

2.成员函数重载运算符要少一个操作数,本类对象占用一个操作数

5.运算符重载的特别注意事项【重点规范】

5.1 究竟把运算符重载函数作为类的成员函数好,还是友元函数好?

1.C++规定,=,[],(),->必须作为成员函数

2.流插入<<和流提取运算符>>、类型转换运算符不能定义为类的成员函数,只能作为友元函数

3.一般将单目运算符和复合运算符重载为成员函数

4.一般将双目运算符重载为友元函数

5.2 例题:声明一个字符串类String,用来存放不定长的字符串,重载运算符"==","<",">",使他们能用于两个字符串的等于、小于和大于的比较运算 -- 重载双目运算符

tips:双目运算符一般使用友元函数重载运算符

5.3 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0起算。要求输出分和秒的值 --- 重载单目运算符

tips:单目运算符一般使用成员函数重载运算符

6.特殊的重载运算符

6.1 ++,--运算符重载

因为++,--分别有两种使用方法,所以要考虑前置,还是后置的问题

关键问题:如何区分是前置自增还是后置自增?

在自增(自减)运算符重载函数中,增加一个int型参数,用来标记后置自增(自减)运算符重载,区分前置自增(自减).

前置自增运算符重载:

返回值类型 operator++();

后置自增运算符重载:

返回值类型 operator++(int);
// 注意后置单目运算,操作方法,一般是先复制一个对象,在修改调用对象,返回复制的对象

6.2 重载流插入运算符和流提取运算符

c++中的cin和cout分别是istream和ostream流的对象,<<和>>在系统中进行了重载

"<<"重载函数格式

ostream& operator<<(ostream &,自定义类&)

">>"重载函数格式

istream& operator>>(istream&,自定义类&)

调用方法:

流对象<<(>>)自定义类对象;

注意:

1.重载运算符"<<"的函数的第一个参数和函数的返回类型都必须是ostream&类型对象的引用

2.重载运算符">>"的函数的第一个参数和函数的返回类型都必须是istream&类型对象的引用

3.ostream&一般传入的参数是cout,istream一般传入的参数为cin,然后就可以在重载函数里面使用cin和cout进行输出和输入了,只不过是指向cin和cout对象的名字变了一下而已

4.return 流对象 的作用是

能连续向流中输出和输入数据。
posted @ 2022-07-30 15:19  nanfengnan  阅读(167)  评论(2编辑  收藏  举报