1. 运算符重载介绍
之前的函数重载,允许多个同名不同参数类型的函数;
运算符重载允许程序员如何使用运算符(如+、-、==、=和!)来处理不同类型的数据类型;
对于基本数据类型,运算符是可以使用的:
对于自定义数据类型:
如果为对自定义MyString的运算符+定义,会出现编译错误。
当一个运算符重载时,对于C++将会根据数据的类型,选择合适的重载运算符;
C++中除了arithmetic if (?:), sizeof,scope (::), member selector (.), and member pointer selector (.*)不能重载;
在进入话题前,必须清楚:
A)重载的运算操作数至少有一个是自定义数据;
B)只能重载已有的运算符;
C)所有运算符保持其优先级和结合;
2)运算符即函数
在C++中,运算符当作运算符看待,如<<、>>等。
2. 重载算术运算符
算术运算符:+、-、*、/、%
这4个运算符都为二元,重载方式几乎一样。
1)使用友元函数重载运算符
当运算符不改变运算操作数,最好使用友元函数重载运算符。
2)对不同类型的操作数重载运算符
当为不同类型的操作数重载二元运算符时,都需写2个函数。如上例的+的参数是一个Cent和整数时:
3. 重载I/O运算符
1)重载输出符:<<
2)重载输入符:>>
重载I/O运算符,便于将你的自定义类输出;
4. 重载比较运算符
比较运算符:==、!=、>、>=、<、<=
因为比较运算符都是二元运算符,而且都不需要改变参数的值,可以使用友元函数进行重载;
依然使用硬币类:
5. 重载单元运算符
单元运算符:+、-、!
6. 使用成员函数重载运算符
使用友元函数重载,不修改操作的参数相关值;
当需要修改操作数时,使用成员函数重载运算符;
需注意两点:A)最左边的操作数必须是类对象;B)最左边的操作数类似于*this参数。
两点例外:
A)最左边参数不是类的成员,如重载+(int, YourClass)或<<(ostream& out, YourClass),必须作为友元重载;
B)赋值=,中括号[],调用()和成员选择->,必须作为成员函数重载。
2)重载单元运算符+、-
7. 重载自增和自减运算符
自增(++)和自减(--)运算符有前缀和后缀两种形式。
因为自增和自减函数修改了操作数,所以最好是成员函数重载的方式。
1)前缀方式:
2)后缀方式:
在重载后缀时,C++使用了傀儡的变量,即虚假的:
因为后缀的方式,需要赋值返回自增自减之前的状态;
8. 重载中括号运算符
中括号是必须成员函数重载的运算符之一。
通常在数组中使用。
中括号一般在处理一维数组时较为有用。
9. 重载括号运算符
例如:
当然重载()运算符,也可以不带参数。
10. 重载类型转换符
之前,类型转换有显式和隐式转换;
也可以进行其他的有用转换:
11. 拷贝构造函数和重载赋值运算符
1)拷贝构造函数
拷贝构造函数是从一个已有的对象初始化一个新的对象 ;
12. 浅拷贝和深复制
浅拷贝-即只是将对象的值复制一个副本给其他对象;修改其他对象,不改变原来的对象;
深拷贝-将对象的引用指针返回给其他对象;修改了其他对象,同样修改了原来对象
如果需防止拷贝:可以将含参构造函数和重载赋值运算符私有化即可。