这一篇介绍C++中非常重要的一部分知识——运算符重载
如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢
运算符重载
- 运算符重载的作用是赋予运算符自定义功能,如 ‘ + ’ 号可以实现 ‘常数+常数’ 等常规的加法运算,但是对于 ‘对象+对象’ 、‘对象+常数’ 、‘常数+对象’ 等操作在默认情况下不被允许,但是可以通过重载 ‘ + ’ 实现这些运算
- 形式为:返回值类型 operator运算符(参数列表);
- 参数列表中必须有一个类类型的参数(最好是引用,避免进行拷贝构造)
- 在类内进行运算符重载,参数列表中默认左边有一个所在类类型的参数,这个也比较好理解,类中的非静态成员函数左边都默认有一个所在类类型的参数(this指针,上一篇有介绍),运算符重载是一种特殊的函数,又是在类内进行重载的,所以它也有一个所在类类型的参数(this指针)
- 不是所有的运算符都支持重载,支持重载的运算符又分为支持类内和类外重载(有些运算符既可以在类内重载也可以在类外重载,但有些运算符只可以在类内(类外)重载)
重载规则
《C++ Primer(第5版)》中给出的可重载和不可重载运算符
- 赋值" = "、下标" [ ] "、调用"( )"和成员访问"->"运算符必须是成员
- 复合赋值运算符(如:+= 等)一般来说应该是成员,但并非必须,这一点与赋值运算符略有不同
- 改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常应该是成员
- 具有对称性的运算符可能转换为任一端的运算对象,例如算术、相等性、关系和位运算符等,因此它们通常应该是普通的非成员函数
一般运算符重载
#include
特殊运算符重载
- cout 是 class ostream 的对象,cin 是 class istream 的对象,这两个只能在类外重载,因为 << 作用在左边的 cout 上,>> 作用在左边的 cin 上,类内重载函数默认最左边有一个参数是当前类的指针,将 cout 和 cin 传入类内重载的函数会发生冲突
class
- 重载++(自加)、--(自减)运算符,类内重载和类外重载不允许同时存在
class
转换函数(类型转换的重载)
- C++ 提供了两种强制类型转换的方式,一种是 (int)a;另一种是 int(a),C 语言只提供一种 (int)a
- 转换函数——没有显示返回类型,但是要写返回值(返回值类型就是要转换成的类型);必须定义成类的非静态成员函数,没有参数(有一个默认所在类的参数(this指针));不应该改变对象的内容,所以一般是const函数
class
如果未特殊说明,以上测试均是在win10 vs2017 64bit编译器下进行的