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对象。

原文地址:https://www.cnblogs.com/Tang-tangt/p/9678178.html