运算符重载__ERZE


1. 运算符重载介绍

1)之前的函数重载,允许多个同名不同参数类型的函数;
运算符重载允许程序员如何使用运算符(如+、-、==、=和!)来处理不同类型的数据类型;
对于基本数据类型,运算符是可以使用的:
这里写图片描述
对于自定义数据类型:
这里写图片描述
如果为对自定义MyString的运算符+定义,会出现编译错误。
当一个运算符重载时,对于C++将会根据数据的类型,选择合适的重载运算符;
C++中除了arithmetic if (?:), sizeof,scope (::), member selector (.), and member pointer selector (.*)不能重载;
在进入话题前,必须清楚:
A)重载的运算操作数至少有一个是自定义数据;
B)只能重载已有的运算符;
C)所有运算符保持其优先级和结合;

2)运算符即函数

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

2. 重载算术运算符

算术运算符:+、-、*、/、%
这4个运算符都为二元,重载方式几乎一样。
1)使用友元函数重载运算符
当运算符不改变运算操作数,最好使用友元函数重载运算符。
运算符重载__ERZE_第1张图片
2)对不同类型的操作数重载运算符
当为不同类型的操作数重载二元运算符时,都需写2个函数。如上例的+的参数是一个Cent和整数时:
运算符重载__ERZE_第2张图片

3. 重载I/O运算符

1)重载输出符:<<
运算符重载__ERZE_第3张图片
2)重载输入符:>>
重载I/O运算符,便于将你的自定义类输出;
运算符重载__ERZE_第4张图片

4. 重载比较运算符

比较运算符:==、!=、>、>=、<、<=
因为比较运算符都是二元运算符,而且都不需要改变参数的值,可以使用友元函数进行重载;
依然使用硬币类:
运算符重载__ERZE_第5张图片

5. 重载单元运算符

单元运算符:+、-、!
运算符重载__ERZE_第6张图片

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

使用友元函数重载,不修改操作的参数相关值;
当需要修改操作数时,使用成员函数重载运算符;
需注意两点:A)最左边的操作数必须是类对象;B)最左边的操作数类似于*this参数。
两点例外:
A)最左边参数不是类的成员,如重载+(int, YourClass)或<<(ostream& out, YourClass),必须作为友元重载;
B)赋值=,中括号[],调用()和成员选择->,必须作为成员函数重载。
2)重载单元运算符+、-
运算符重载__ERZE_第7张图片
成员函数的典型应用是用于修改私有成员变量。

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

自增(++)和自减(–)运算符有前缀和后缀两种形式。
因为自增和自减函数修改了操作数,所以最好是成员函数重载的方式。
1)前缀方式:
运算符重载__ERZE_第8张图片
2)后缀方式:
在重载后缀时,C++使用了傀儡的变量,即虚假的:
运算符重载__ERZE_第9张图片
运算符重载__ERZE_第10张图片
因为后缀的方式,需要赋值返回自增自减之前的状态;

8. 重载中括号运算符

中括号是必须成员函数重载的运算符之一。
通常在数组中使用。
运算符重载__ERZE_第11张图片
中括号一般在处理一维数组时较为有用。

9. 重载括号运算符

例如:
运算符重载__ERZE_第12张图片
当然重载()运算符,也可以不带参数。

10. 重载类型转换符

之前,类型转换有显式和隐式转换;
运算符重载__ERZE_第13张图片
也可以进行其他的有用转换:
运算符重载__ERZE_第14张图片

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

1)拷贝构造函数
拷贝构造函数是从一个已有的对象初始化一个新的对象 ;
运算符重载__ERZE_第15张图片

12. 浅拷贝和深复制

浅拷贝-即只是将对象的值复制一个副本给其他对象;修改其他对象,不改变原来的对象;
深拷贝-将对象的引用指针返回给其他对象;修改了其他对象,同样修改了原来对象
如果需防止拷贝:可以将含参构造函数和重载赋值运算符私有化即可。**
转载:http://write.blog.csdn.net/mdeditor*

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