运算符重载的设计意义大吗?
正常使用运算符重载可以是程序更简洁,但是滥用之,则困之,滥用会是程序晦涩难懂!
1、从开发的角度而言,运算符重载的存在是为了提高开发效率,增加代码的可复用性,很多时候反而是简化了问题,具体实现被复杂化,但是暴露的接口得到了简化,使对象之间可以做运算操作的,如+-*/。
2、C++强大的原因之一是支持泛型编程。泛型编程使得算法可以独立于数据类型存在。自定义的数据类型通过操作符重载具有了和内建类型同样的使用接口,然后C++的模板加持下,你的算法可以利用这种接口一致性,实现泛化,实现算法的通用化。
3、除了提高写代码的效率,也往往降低了代码维护的成本,更容易减少bug,提高代码质量,实现低耦合。
01 运算符重载的需求
C++ 预定义的运算符,只能用于基本数据类型的运算:整型、实型、字符型、逻辑型等等,且不能用于对象的运算。但是我们有时候又很需要在对象之间能用运算符,那么这时我们就要重载运算符,使得运算符能用于对象之间的运算。
比如,在数学上,两个复数可以直接进行+、-等运算,但在C++中,直接将+或-用于复数对象是不允许的。有时会希望,让对象也能通过运算符进行运算。这样代码就更简洁,也容易理解。
02 运算符重载的形式
运算符重载的实质就是函数重载,可以重载为普通函数,也可以重载为成员函数。运算符重载的基本形式如下:
返回值类型 operator 运算符(形参表)
{
...
}
03可重载运算符/不可重载运算符
1、下面是可重载的运算符列表:
双目算术运算符 + (加),-(减),*(乘),/(除),% (取模)
关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符 + (正),-(负),*(指针),&(取地址)
自增自减运算符 ++(自增),--(自减)
位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放 new, delete, new[ ] , delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标)
2、下面是不可重载的运算符列表:
• .:成员访问运算符
• .*, ->*:成员指针访问运算符
• :::域运算符
• sizeof:长度运算符
• ?::条件运算符
• #: 预处理符号