运算符重载

运算符重载概念

对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

运算符重载的实质是编写以运算符作为名称的函数。不妨把这样的函数称为运算符函数。运算符函数的格式如下:

运算符重载为全局函数时,参数的个数等于运算符的目数(即操作数的个数);运算符重载为成员函数时,参数的个数等于运算符的目数减一。

加号运算符重载

作用:实现两个自定义数据类型相加的运算。

没有重载:

运算符重载_第1张图片

报错

运算符重载_第2张图片

成员函数重载

运算符重载_第3张图片运算符重载_第4张图片

全局函数重载

运算符重载_第5张图片运算符重载_第6张图片

换成加整数也可以

运算符重载_第7张图片

运算符重载_第8张图片

总结1:对于内置的数据类型的表达式的的运算符是不可能改变的

总结2:不要滥用运算符重载

 左移运算符重载

作用:可以输出自定义数据类型

不会利用成员函数重载<<,因为无法实现cout在左侧

cout是输出流对象,全局只能有一个,因此ostream &cout

运算符重载_第9张图片

运算符重载_第10张图片

运算符重载_第11张图片

总结:重载左移运算符配合友元可以实现输出自定义数据类型

递增运算符重载

作用: 通过重载递增运算符,实现自己的整型数据

前置++:

运算符重载_第12张图片

C++ 规定,在重载++--时,允许写一个增加了无用 int 类型形参的版本,编译器处理++--前置的表达式时,调用参数个数正常的重载函数;处理后置表达式时,调用多出一个参数的重载函数。来看下面的例子:

前置完整代码:

运算符重载_第13张图片

后置完整代码:

运算符重载_第14张图片

赋值运算符重载

将对象的值赋值给另一个对象

c++编译器至少给一个类添加4个函数

  1. 默认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝构造函数,对属性进行值拷贝
  4. 赋值运算符 operator=, 对属性进行值拷贝

如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题

运算符重载_第15张图片

运算符重载_第16张图片

会显示为:

运算符重载_第17张图片

因为:堆区内存重复释放,系统崩溃!

解决方案:利用深拷贝来解决浅拷贝带来的问题。

运算符重载_第18张图片

多个对象时

运算符重载_第19张图片

运算符重载_第20张图片

关系运算符重载

可以让两个自定义类型对象进行对比操作

示例:

运算符重载_第21张图片

!=运算符:

运算符重载_第22张图片

 函数调用运算符重载

  • 函数调用运算符 () 也可以重载
  • 由于重载后使用的方式非常像函数的调用,因此称为仿函数
  • 仿函数没有固定写法,非常灵活

示例:

运算符重载_第23张图片

做加法:

运算符重载_第24张图片

你可能感兴趣的:(C++,c++)