C++之运算符重载(一元)
一、-符号重载
1.成员函数重载负号
2.友元函数重载负号
3.补充说明
<1> 《一元运算符编码实现(一)》课程笔记:
A:事实上,我们的重载运算符返回void、返回对象本身、返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值。
那么什么情况下要返回对象的引用呢?
原因有两个:1.允许进行连续赋值2.防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率。
对于第二点原因:如果用”值传递“的方式,虽然功能任然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。
B:用友元函数重载时,参数之所以用引用类型,也是因为原因2,为了降低开销,提高效率。
<2> 《一元运算符编码实现(二)》课程笔记:
但是看了这一节,发现后置++的返回值是对象而非引用,因为,如果返回是引用,那么返回的是一块临时变量(old)的引用,
当后置++的函数调用结束后,该临时变量会被自动释放掉,那么返回的引用的值就会是一个-37983219之类的为初始化的值了,发生bug。
二、++符号的重载
1.前置++重载
2.后置++重载
《一元运算符编码实现(二)》课程笔记:
operator定义了多个函数重载,定义了能传入一到两个参数的operator
为什么后置要传入int?
在一元operator中,运算符要放在参数前面,也就是operator++(*this),在程序中调用一元运算符的格式:
++coor,-coor
operator(int)其实是二元函数,只是第二个参数是通过隐性的方式传入参数,传入int就相当于定义了二元运算符,也就是(this*, int),
这时运算符的格式就是this*指针加运算符加int类型,再给int传入一个默认值1
例如c++1,这就满足了运算符的格式,因此在使用时变成了c++,函数会执行,而内部如何处理,就由我们随便处理。
为什么定义友元类的时候就要传入参数?
因为如果在类中定义非友元运算符(成员函数),那么默认将传入一个*this指针。
而在定义友元类,在类外定义函数,其实就是给予一个函数对该类所有对象数据的修改权限
但是这个函数默认不会传入*this指针,因为需要在参数表中传入
例如 在类的定义中定义了Coordinate& operator-()
系统默认传入了一个this指针
而在友元运算符中,因为opertor必须至少传入一个参数,因此需要传入一个coordinte对象。