C++基础(6)——类和对象(4)

前言

本文主要介绍了C++中运算符重载的基本知识。

4.5.1:加号运算符重载(成员函数和全局函数都可实现)

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

1:成员函数重载+号,this指针指向的是+号左侧的对象

本质:Person p3 = p1.operator+(&p2);

C++基础(6)——类和对象(4)_第1张图片

想用引用作为函数的返回值就要先在堆区开辟内存,栈区的局部变量会在函数执行完之后释放

C++基础(6)——类和对象(4)_第2张图片

2:全局函数实现运算符重载

本质: Person p3 = operator+(p1, p2);

C++基础(6)——类和对象(4)_第3张图片

operator+函数可以实现重载,创建一个就只有类名和Person不同的Human类,同时通过全局函数来实现运算符重载,这是编译器会根据operator+()函数参数的不同来选择使用那一个函数

C++基础(6)——类和对象(4)_第4张图片

 根据参数不同选择不同的重载函数,即运算符重载也可以发生函数重载

C++基础(6)——类和对象(4)_第5张图片

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

C++基础(6)——类和对象(4)_第6张图片

4.5.2:左移运算符重载(全局函数实现)

重载左移运算符可以实现自定义数据类型的输出

左移运算符如果使用成员函数进行重载会出现的问题

void operator<<(cout)会简化成 p << cout,p是一个对象

cout是输出流ostream的一个对象

C++基础(6)——类和对象(4)_第7张图片

当operator<<重载函数的返回值是void类型时

C++基础(6)——类和对象(4)_第8张图片

但是如果想要在cout << p后面再使用<<就会报错了,因为没有用到链式的原则

C++基础(6)——类和对象(4)_第9张图片

当operator<<重载函数的返回值是ostream&类型时,就可以像普通的使用cout那样使用,也用到了函数重载的原理

C++基础(6)——类和对象(4)_第10张图片

4.5.3:++递增运算符重载

1:前置递增

结合友元、<<运算符重载,可以实现前缀++重载的效果

C++基础(6)——类和对象(4)_第11张图片

假如对myint执行两次++的操作,且将operator++的返回类型改成MyInt,而不是引用,那么会新构建一个对象,并对新对象进行操作

C++基础(6)——类和对象(4)_第12张图片

 使用引用&的目的是为了一直对一个对象进行操作,改成引用&输出结果就是想要的了

C++基础(6)——类和对象(4)_第13张图片

2:后置递增(为了和前置++区分,要使用到函数的占位参数)

后置++使用值返回或者引用返回两种情况

引用返回:

C++基础(6)——类和对象(4)_第14张图片

值返回:

C++基础(6)——类和对象(4)_第15张图片

4.5.4:赋值运算符重载

如果使用默认的=运算符进行一些对象的赋值,可能会出现一些浅拷贝直接值赋值的问题

C++基础(6)——类和对象(4)_第16张图片

 如果重写析构函数进行delete,就会出现内存多次释放的问题

C++基础(6)——类和对象(4)_第17张图片

 进行赋值运算符重载

C++基础(6)——类和对象(4)_第18张图片

4.5.5:关系运算符重载

这里重新实现>运算符

C++基础(6)——类和对象(4)_第19张图片

改成引用之后再进行参数传入就不会创建一个新的对象,也就不会出现多次delete内存的情况

C++基础(6)——类和对象(4)_第20张图片

4.5.6:函数调用运算符()重载,仿函数、匿名对象

1:仿一个返回值是void,参数是string的()

C++基础(6)——类和对象(4)_第21张图片

2:仿一个返回值为int,入口参数(int,int)

C++基础(6)——类和对象(4)_第22张图片

总结

以上就是本文的全部内容,非常感谢你能看到这。

你可能感兴趣的:(c++,开发语言)