类和对象中(2)

在这里插入图片描述

一、运算符重载

1、运算符重载出现的原因

  在C语言中,我们只能比较用 > 、 < 、 = >、<、= ><=来比较内置类型的大小,而自定义类型的大小却无法比较。对此,C++为了增强代码的可读性引入了运算符重载。运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

格式:
关键字operator后面接需要重载的运算符符号
函数原型:返回值类型 + operator操作符(参数列表)

并不是所有的运算符都能重载

注意:
1、不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型参数
2、用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义
3、作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
4、.*   ::  sizeof  ?:  .注意以上5个运算符不能重载。这个经常在笔试选择题中出现

2、在全局和类里实现运算符重载

  当我们写成全局函数时,要把类里面的_year等成员变量设置为公有,在类外面才能访问到。这里会发现运算符重载成全局的就需要成员变量是公有的,那么问题来了,封装性如何保证?这里其实可以用我们后面学习的友元解决

放在类里实现:

3、赋值运算符重载

1、为什么赋值运算符重载不能写在全局 ?

  赋值运算符重载和别的运算符重载又有所差异;我们写代码的时候有连续赋值的操作,因此赋值运算符重载必须返回*this

格式:
参数类型:const T&,传递引用可以提高传参效率
返回值类型:T&,返回引用可以提高返回的效率,返回*this:要符合连续赋值的含义
检测是否自己给自己赋值

  赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数

2、什么时候需要自己实现赋值运算符重载 ?

  用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。即如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必须要实现

4、前置++和后置++重载

  前置++返回+之后的值,后置++返回+之前的值,那么前置++和后置++如何构成重载呢 ?
  C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递,前置++可以返回引用,而后置的临时变量temp不能返回引用

5、运算符重载的优势

优势:
1、使得程序的可读性更强:通过运算符重载,可以在类中实现对于运算符的自定义操作,使得程序代码更加简洁、直观,符合人们的习惯,从而增强了程序的可读性。
2、实现程序的通用性和泛化:通过运算符重载,可以将一些类似的操作进行统一化处理,从而实现程序的通用性和泛化,避免了程序中出现大量重复的代码,提高了程序的可维护性和可扩展性。
3、提高程序的效率:通过对运算符的重载,可以在不增加程序复杂度的情况下,提高程序的效率,从而提高程序的运行速度。
4、实现程序的自然性和可读性:运算符重载可以使程序更加接近人类的自然语言,从而使得程序更加易于理解和调试。

二、const成员函数

  将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改

1、两个常见const权限放大错误样例

错误样例1:

  当我们实现某个功能而不需要修改this指针时,我们可以用const修饰this指针,可是this指针不允许显示传递因此我们只能像下面这样加一个const

语法:
void Display() const

  权限可以缩小,却不能放大,因此当外面不需要修改this指针时,我们应该尽量加上const对this进行修饰,以避免出现以下这种情况
错误样例2:

2、const成员函数优势

优点:
1、声明一个成员函数为const可以确保该函数不会修改对象的数据成员,从而提高程序的健壮性和安全性。
2、const成员函数可以被const对象调用,从而限制了对const对象的非法操作,保护了对象的数据成员不被意外修改。
3、const成员函数可以被重载,使用不同的const成员函数可以访问对象的不同成员变量或执行不同的操作,提高程序的灵活性。

总结:
  欢迎阅读小白的文章,如有错误,请严厉指出。下一篇博客我们将用这篇博客的知识实现日期类,期待我们下一篇博客见面!!!

猜你喜欢

转载自blog.csdn.net/Front123456/article/details/130556606