当前位置: 首页 > news >正文

[C++ ]:5.类和对象中(运算符重载补充)+ 类和对象下(初始化列表)

类和对象中(运算符重载补充)+ 类和对象下(初始化列表)

  • 一.运算符重载补充:
    • 1.流插入运算符:
      • 1.==考虑到隐含的参数指针:==
      • 2.进行优化!
        • 2-1:解决办法:友元
        • 2-2:流插入一定满足连续?
      • 3.总结:
    • 2.流提取运算符:
  • 二.const 成员:
      • 1.概念进入:
      • 2.具体操作:
      • 3.参数变化:
        • 3-1:权限下降!
      • 4.成员函数const 原则:
  • 三.构造函数补充:
    • 1.初始化:
    • 2.初始化列表:
    • 3.作用:
      • 1.const的初始化:
      • 2.引用的初始化:
      • 3.自定义类型成员的初始化:
        • 3-1.自定义类型初始化列表:
        • 3-2.所有都可以使用初始化列表?
      • 4.初始化列表的顺序!
    • 4.总结:
      • 1.引用,const,没有默认构造的自定义类型成员!
      • 2.自定义类型的成员有显示的构造函数!
      • 3.尽量使用初始化列表因为不使用也会走到初始化列表中!
        • 3-1:

一.运算符重载补充:

请添加图片描述

1.流插入运算符:

我们知道进行运算符重载这个函数的参数的左右类型是非常重要的,我们尝试在类中去定义这个流插入重载!

1.考虑到隐含的参数指针:

请添加图片描述

2.进行优化!

我们观察上面的代码发现可以实现在类中进行流插入运算符的一个重载但是我们需要考虑隐含参数的位置所以我们进行传参的时候就 写成了 == d1<<cout ==.

上面这个语句是非常奇怪的因为我们之前使用cout的时候把类型的数据插入到cout中但是上面这个就是把cout插入到d1中这是不好的!

请添加图片描述

没有人规定类的操作符必须要写在类中!
我们把函数定义到全局中-》出现了一个问题我们在全局中是找不到成员变量的!我们成员变量是私有的我们不希望成员变量不去使用成员函数而发生改变!

2-1:解决办法:友元

通过friend 关键字去在类中声明一个友元函数就可以解决,我是你的朋友可以访问私有的成员变量!

在这里插入图片描述

2-2:流插入一定满足连续?

我们通过前面的知识我们知道满足连续性这个函数就需要一个返回值!

在这里插入图片描述

3.总结:

其他的运算符一般是实现在成员函数中,但是流插入和流提取操作符是实现在全局的。

1.因为存在隐含的参数(影响了操作符的顺序)。
1-1:写在全局改变了函数传参的顺序并且满足了正常的cout的使用顺序!

2.写到全局访问不到私有的问题?
2-1:友元解决!

2.流提取运算符:

请添加图片描述
请添加图片描述
请添加图片描述

二.const 成员:

1.概念进入:

请添加图片描述

我们观察上面的代码会发现?
我们定义了一个const Date 类型的d2是不想要d2这个日期对象被修改但是我们的隐含参数默认是一个Date* 类型,所以参数列表不匹配!

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

2.具体操作:

请添加图片描述
请添加图片描述

需要特别注意成员函数定义和声明分开的时候const都需要加上和缺省参数不一样!

3.参数变化:

请添加图片描述

3-1:权限下降!

请添加图片描述

4.成员函数const 原则:

1.可以定义成const 的成员函数都应该定义,这样const 和非const 对象都可以调用。
2.如果不去定义const 那么const类型的对象就不可以去进行成员函数调用!
3.如果有需要修改成员变量的函数不可以使用const去修饰!

三.构造函数补充:

1.初始化:

我们之前通过构造函数去初始化成员变量其实是一种赋值!

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称之初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

2.初始化列表:

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

在这里插入图片描述

3.作用:

1.const的初始化:

请添加图片描述

2.引用的初始化:

我们知道引用是必须需要初始化,第一次是地址,之后都是赋值!所以我们不可以让引用类型的成员变量在赋值的时候再去拿到别的值! 不然会产生赋值之后的这个成员变量到底是谁的别名! 通过在初始化列表进行初始化我们再去赋值我们就知道这个引用是谁的别名。

请添加图片描述

3.自定义类型成员的初始化:

请添加图片描述

我们通过初始化列表就可以自己搞定初始化一个队列!

3-1.自定义类型初始化列表:

通过初始化列表自己去调用对应的构造函数去完成我们想要多大的栈就可以初始化多大的栈!

请添加图片描述

3-2.所有都可以使用初始化列表?

我们不能完全舍弃构造函数初始化!因为对于构造函数来说处理栈空间开辟是否成功等比较长的代码上是比较有优势的。初始化列表没有办法去判断栈空间是否开辟成功!

请添加图片描述

4.初始化列表的顺序!

初始化列表要和类的成员变量定义顺序相同!
在这里插入图片描述

4.总结:

1.引用,const,没有默认构造的自定义类型成员!

在这里插入图片描述

2.自定义类型的成员有显示的构造函数!

请添加图片描述

3.尽量使用初始化列表因为不使用也会走到初始化列表中!

3-1:

80%----100% 使用初始化列表:
0%-20% 进行初始化列表+构造函数的混和使用!

http://www.lryc.cn/news/215171.html

相关文章:

  • D. Doremy‘s Connecting Plan Codeforces Round 906 (Div. 2)
  • Prometheus+Grafana
  • CoCa论文笔记
  • uniapp 微信小程ios端键盘弹起后导致页面无法滚动
  • 三维模型优势在哪里?如何提升产品自身商业价值?
  • WheatA 轻量级生态数据软件
  • 2127. 参加会议的最多员工数 : 啥是内向/外向基环树(拓扑排序)
  • Qt入门日记1
  • SpringBoot_第七章(读写分离)
  • linux下mysql-8.2.0集群部署(python版本要在2.7以上)
  • 40 深度学习(四):卷积神经网络|深度可分离卷积|colab和kaggle的基础使用
  • Spring Boot面向切面加注解
  • uniapp小程序授权统一处理
  • 光学仿真|优化汽车内部照明体验
  • Spring XML使用CASE WHEN处理SELECT字段
  • 关于C#中使用多线程的讨论
  • 工程机械数字孪生可视化平台建设,推动大型装备智能化数字化转型升级
  • Linux 网络流量监控利器 iftop命令详解及实战
  • protected by SourceGuardian and requires a SourceGuardian loader ‘ixed.8解决方案
  • KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(14)
  • 2023-macOS下安装anaconda,终端自动会出现(base)字样,如何取消
  • Nginx搭载负载均衡及前端项目部署
  • 深度学习——炼丹
  • Matlab中的app设计
  • 曾经遇到过的无法解释的问题
  • 基于uniapp与uview做一个按拼音首字母排序的通讯录页面
  • 网络工程师-入门基础课:华为HCIA认证课程介绍
  • 玻色量子成功研制光量子计算专用光纤恒温控制设备——“量晷”
  • 力扣:147. 对链表进行插入排序(Python3)
  • OpenCV4(C++)——形态学(腐蚀、膨胀)