C++学习第10篇-运算符重载

1. 运算符重载介绍

之前的函数重载,允许多个同名不同参数类型的函数;

运算符重载允许程序员如何使用运算符(如+、-、==、=和!)来处理不同类型的数据类型;

对于基本数据类型,运算符是可以使用的:


对于自定义数据类型:


如果为对自定义MyString的运算符+定义,会出现编译错误。

当一个运算符重载时,对于C++将会根据数据的类型,选择合适的重载运算符;

C++中除了arithmetic if (?:), sizeof,scope (::), member selector (.), and member pointer selector (.*)不能重载;

在进入话题前,必须清楚:

A)重载的运算操作数至少有一个是自定义数据;

B)只能重载已有的运算符;

C)所有运算符保持其优先级和结合;

2)运算符即函数

在C++中,运算符当作运算符看待,如<<、>>等。

2. 重载算术运算符

算术运算符:+、-、*、/、%

这4个运算符都为二元,重载方式几乎一样。

1)使用友元函数重载运算符

当运算符不改变运算操作数,最好使用友元函数重载运算符。

C++学习第10篇-运算符重载_第1张图片

2)对不同类型的操作数重载运算符

当为不同类型的操作数重载二元运算符时,都需写2个函数。如上例的+的参数是一个Cent和整数时:

C++学习第10篇-运算符重载_第2张图片

3. 重载I/O运算符

1)重载输出符:<<

C++学习第10篇-运算符重载_第3张图片

2)重载输入符:>>

C++学习第10篇-运算符重载_第4张图片

重载I/O运算符,便于将你的自定义类输出;

4. 重载比较运算符

比较运算符:==、!=、>、>=、<、<=

因为比较运算符都是二元运算符,而且都不需要改变参数的值,可以使用友元函数进行重载;

依然使用硬币类:


C++学习第10篇-运算符重载_第5张图片

5. 重载单元运算符

单元运算符:+、-、!

C++学习第10篇-运算符重载_第6张图片

6. 使用成员函数重载运算符

使用友元函数重载,不修改操作的参数相关值;

当需要修改操作数时,使用成员函数重载运算符;

需注意两点:A)最左边的操作数必须是类对象;B)最左边的操作数类似于*this参数。

两点例外:

A)最左边参数不是类的成员,如重载+(int, YourClass)或<<(ostream& out, YourClass),必须作为友元重载;

B)赋值=,中括号[],调用()和成员选择->,必须作为成员函数重载。

2)重载单元运算符+、-

C++学习第10篇-运算符重载_第7张图片
成员函数的典型应用是用于修改私有成员变量。

7. 重载自增和自减运算符

自增(++)和自减(--)运算符有前缀和后缀两种形式。

因为自增和自减函数修改了操作数,所以最好是成员函数重载的方式。

1)前缀方式:

\

2)后缀方式:

在重载后缀时,C++使用了傀儡的变量,即虚假的:

C++学习第10篇-运算符重载_第8张图片

C++学习第10篇-运算符重载_第9张图片

因为后缀的方式,需要赋值返回自增自减之前的状态;

8. 重载中括号运算符

中括号是必须成员函数重载的运算符之一。

通常在数组中使用。


中括号一般在处理一维数组时较为有用。

9. 重载括号运算符

例如:


当然重载()运算符,也可以不带参数。

10. 重载类型转换符

之前,类型转换有显式和隐式转换;


也可以进行其他的有用转换:


11. 拷贝构造函数和重载赋值运算符

1)拷贝构造函数

拷贝构造函数是从一个已有的对象初始化一个新的对象 ;


12. 浅拷贝和深复制

浅拷贝-即只是将对象的值复制一个副本给其他对象;修改其他对象,不改变原来的对象;

深拷贝-将对象的引用指针返回给其他对象;修改了其他对象,同样修改了原来对象

如果需防止拷贝:可以将含参构造函数和重载赋值运算符私有化即可。


【免责特此声明:
1)本内容可能是来自互联网的,或经过本人整理的,仅仅代表了互联网和个人的意见和看法!
2)本内容仅仅提供参考,任何参考该内容造成任何的后果,均与原创作者和本博客作者无关!】

你可能感兴趣的:(C++,c)