C++面向对象语法总结(三)

  • 目录
    • 《C++面向对象语法总结(一)》
    • 《C++面向对象语法总结(二)》

二十一、多继承

  • C++允许一个类可以有多个父类(不建议使用,会增加程序设计复杂度)
  • 在多继承中,会按照继承顺序将父类的成员变量放到子类成员变量的前面
    在这里插入图片描述
  • 多继承体系中,子类调用父类构造函数只需要在初始化列表中调用即可
    在这里插入图片描述
  • 如果子类继承的多个父类都有虚函数,那么子类对象就会产生对应的多张虚表
    在这里插入图片描述
  • 如果子类和父类中都有相同的同名函数,直接调用会调用子类中的函数,调用父类中的同名函数需要显式指定父类名称
    在这里插入图片描述
    在这里插入图片描述
  • 如果子类和父类都具有同名的成员变量,直接调用会调用子类的成员变量,如果需要调用父类的成员变量,需要显式指定调用的父类
    在这里插入图片描述

二十二、菱形继承

  • 菱形继承指的是两个类继承了一个超类,然后有一个子类又多继承了这两个类,其继承关系图类似于菱形
    在这里插入图片描述

  • 菱形继承的问题

    • 最底下的子类从积累继承的成员变量冗余、重复
    • 最底下的子类无法访问基类的成员,有二义性
      在这里插入图片描述

二十三、虚继承

  • 虚继承指的是在继承的类前面加上virtual关键字
  • 虚继承可以解决菱形继承带来的问题
  • Person类被称为虚基类
    在这里插入图片描述
  • 虚继承会增加内存中的数据量,在虚继承中,虚表中一般会包含两个偏移量
    • 虚表指针于本类起始的偏移量(一般是0)
    • 虚基类第一个成员变量与本类起始的偏移量
      在这里插入图片描述
  • 虚继承的内存图(32位环境)
    在这里插入图片描述

二十四、静态成员(static)

  • 静态成员:被static修饰的成员变量或函数

    • 可以通过对象(对象.静态成员)、对象指针(对象指针 -> 静态成员)、类(类::静态成员)来访问静态成员变量或函数
  • 静态成员变量

    • 存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存
    • 对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的
    • 必须初始化,而且必须在类的外面初始化,初始化时不能带static,如果累的声明和实现分离,需要在实现(cpp文件)中初始化
      在这里插入图片描述
  • 静态成员函数

    • 内部不能使用this指针(this指针只能用在非静态成员函数内部)
    • 不能是虚函数(虚函数只能是非静态成员函数)
    • 内部不能访问非静态的成员变量和函数,只能访问静态的成员变量和函数
    • 非静态成员函数内部可以访问静态成员变量和函数
    • 构造函数、析构函数不能是静态
    • 当声明和实现分离时,实现部分不能带static
  • 静态成员经典应用——单例模式
    在这里插入图片描述

二十五、const成员

  • const成员:被const修饰的成员变量、非静态成员函数
  • const成员变量
    • 必须初始化(类内部初始化),可以在声明的时候直接初始化赋值
    • 非static的const成员变量还可以再初始化列表中初始化
  • const成员函数(非静态)
    • const关键字写在参数列表后面,函数的声明和实现都必须带const
    • 内部不能修改非static成员变量
    • 内部只能调用const成员函数,static成员函数
    • 非const成员函数可以调用const成员函数
    • const成员函数和非const成员函数构成重载
    • 非const对象(指针)优先调用非const成员函数
    • const对象(指针)只能调用const成员函数、static成员函数
      在这里插入图片描述

二十六、引用类型成员

  • 引用类型成员变量必须初始化(不考虑static情况)
    • 在声明的时候直接初始化
    • 通过初始化列表初始化
      在这里插入图片描述

二十七、拷贝构造函数(Copy Constructor)

  • 拷贝构造函数是构造函数的一种
  • 当利用已存在的对象创建一个新对象(类似于拷贝),就会调用新对象的拷贝构造函数进行初始化
  • 拷贝构造函数格式是固定的,接受一个const引用作为参数
  • 类中默认的拷贝构造函数是直接拷贝已有对象的内存,当对象中有指针变量时,也是拷贝的指针变量的值,而不是指针变量指向的对象,所以是浅拷贝
    在这里插入图片描述
  • 继承体系中调用父类的拷贝构造函数直接在初始化列表显式调用,继承体系中默认也会直接拷贝父类对象的内存(因为变量的内存是连续的)
    在这里插入图片描述
  • 拷贝构造函数的使用
    • 下面代码中,car2、car3都是通过拷贝构造函数初始化的,car、car4是通过非拷贝构造函数初始化的
    • 变量前面有类型是新建对象的操作,没有类型是赋值操作,如car4=car3就是复制操作(默认是浅拷贝),并不会调用拷贝构造函数
      在这里插入图片描述

二十八、浅拷贝、深拷贝

  • 对于指针变量,如果只是拷贝了指针的地址,并没有拷贝指向的具体的值,叫做浅拷贝,如果拷贝了指向的值,就叫做深拷贝
  • 编译器默认提供的拷贝是浅拷贝
    • 将一个对象中所有成员变量的值拷贝到另一个对象(直接拷贝内存中的值)
    • 如果某个成员变量是指针,只会拷贝指针中存储的地址值,并不会拷贝指针指向的内存空间的值
    • 可能会导致堆空间多次free的情况,因为浅拷贝拷贝的是地址,在拷贝的不同对象中free内存,实际上释放的是同一个内存空间
  • 如果需要实现深拷贝,就需要自定义拷贝构造函数
    • 将指针类型的成员变量所指向的内存空间内的值,拷贝到新的内存空间
  • 深拷贝示例
    在这里插入图片描述

二十九、对象型参数和返回值

  • 使用对象类型作为函数的参数或者返回值,是进行了对象拷贝的,可能会产生一些不必要的中间对象
  • 函数参数默认是拷贝传递,所以作为对象参数,也会拷贝
  • 因为函数栈中的对象调用完会释放,所以作为返回值的时候,编译器必须进行拷贝,原来函数中的对象已经释放了
    在这里插入图片描述

三十、匿名对象(临时对象)

  • 匿名对象:没有变量名、没有被指针指向的对象,用完后马上调用析构
  • 匿名对象作为实参和返回值时,编译器会做优化,只会产生一个对象,调用一次构造函数
    在这里插入图片描述

三十一、隐式构造

  • c++ 中存在隐式构造的现象:在某些情况下,会隐式调用单参数的构造函数
    在这里插入图片描述
  • 可以通过关键字explicit禁止掉隐式构造
    在这里插入图片描述

三十二、编译器自动生产构造函数的情况

  • c++的编译器在某些特定的情况下,会给类自动生成无参的构造函数,比如

    • 成员变量在声明的同时进行了初始化
    • 有定义虚函数
    • 继承了其他的类
    • 包含了对象类型成员,且这个成员有构造函数(编译器生成或自定义)
    • 父类有构造函数(编译器生成或自定义)
  • 对象创建后,需要做一些额外的操作时(比如内存操作、函数调用),编译器一般都会为其自动生成无参的构造函数

  • 并不是所有情况都会生成无参的构造函数

三十三、内部类

  • 如果将类A定义在类C的内部,那么类A就是一个内部类(嵌套类)
  • 内部类的特点
    • 支持public、protected、private权限
    • 成员函数可以直接访问其外部类的所有成员(反过来则不行)
    • 成员函数可以直接不带类名、对象名访问其外部类的static成员
    • 不会影响外部类的内存布局
    • 可以在外部类内部声明,在外部类外面进行定义
      在这里插入图片描述
  • 内部类声明和实现分离的写法
    在这里插入图片描述

三十四、友元

  • 友元包括友元函数和友元类
  • 如果将函数A(非成员函数)声明为类C的友元,那么函数A就能直接访问类C对象的所有成员
  • 如果将类A声明为类C的友元,那么类A中的所有成员函数都能直接访问类C对象的所有成员
  • 友元破坏了面向对象的封装性,但在某些频繁访问成员变量的地方可以提高性能
  • 友元的声明可以在类的任何位置
    在这里插入图片描述

三十五、局部类

  • 在一个函数内部定义的类,称为局部类
  • 局部类的特点
    • 作用域仅限于所在函数内部
    • 其所有成员必须定义在类内部,不允许定义static成员变量
    • 成员函数不能直接访问函数的局部变量(static变量除外)
      在这里插入图片描述

后记
  个人总结,欢迎转载、评论、批评指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/289207.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

踩坑Vant组件 Dialog的组件调用

今天踩了一个非常蠢的坑,自己给自己蠢死的坑 在使用组件调用时自己没引入Dialog组件导致一直报错 不知道为什么全局引入不好使,后来使用了局部引用 现在没问题了 就这样局部引入一个Dialog.Component就可以了

CEEMDAN +组合预测模型(Transformer - BiLSTM+ ARIMA)

目录 往期精彩内容: 前言 1 风速数据CEEMDAN分解与可视化 1.1 导入数据 1.2 CEEMDAN分解 2 数据集制作与预处理 3 基于CEEMADN的 Transformer - BiLSTM 模型预测 3.1 定义CEEMDAN-Transformer - BiLSTM预测模型 3.2 设置参数,训练模型 4 基于A…

【日积月累】Java Lambda 表达式

目录 【日积月累】Java Lambda 表达式 1.前言2.语法3.应用场景3.1简化匿名内部类的编写3.1简化匿名内部类的编写3.2简化集合类中的操作3.3实现函数式接口3.4简化多个方法的调用3.5简化异步编程 4.总结5.参考 文章所属专区 日积月累 1.前言 Lambda表达式是一个匿名函数&#…

数据库索引、三范式、事务

索引 索引(Index)是帮助 MySQL 高效获取数据的数据结构。常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树(B-tree)。 常见索引原则有 选择唯一性索引:唯一性索引的值是唯…

爬虫入门与urllibrequests

前情摘要 一、web请求全过程剖析 我们浏览器在输入完网址到我们看到网页的整体内容, 这个过程中究竟发生了些什么? 我们看一下一个浏览器请求的全过程 接下来就是一个比较重要的事情了. 所有的数据都在页面源代码里么? 非也~ 这里要介绍一个新的概念 那就是页面渲染数据的…

[C#]使用onnxruntime部署Detic检测2万1千种类别的物体

【源码地址】 github地址:https://github.com/facebookresearch/Detic/tree/main 【算法介绍】 Detic论文:https://arxiv.org/abs/2201.02605v3 项目源码:https://github.com/facebookresearch/Detic 在Detic论文中,Detic提到…

基于Java SSM框架实现中国古诗词学习平台项目【项目源码】

基于java的SSM框架实现中国古诗词学习平台系统演示 JSP技术介绍 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了用…

Docker中的核心概念

1.镜像 Image 一个镜像就代表一个软件。mysql镜像、redis镜像、mq镜像 2.容器 Container 一个镜像运行一次就会生成一个容器,容器就是一个运行的软件服务。 3.远程仓库 Repository 远程仓库用来存储所有软件的镜像,Docker Hub 4.本地仓库 用来存储…

谷歌推出了一种名为提示扩展(Prompt Expansion)的创新框架,旨在帮助用户更轻松地创造出既高质量又多样化的图像。

谷歌推出了一种名为提示扩展(Prompt Expansion)的创新框架,旨在帮助用户更轻松地创造出既高质量又多样化的图像。 论文标题: Prompt Expansion for Adaptive Text-to-Image Generation 论文链接: https://arxiv.org/pdf/2312.16720.pdf 问…

如何删除K8S中的Pod

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

生信技能32 - 导入UCSC公共数据库SNP数据至本地MySQL数据库

本文以导入SNP151.txt数据库为例,其他数据库文件操作类似。 1. 数据文件下载 UCSC下载网址: https://hgdownload.cse.ucsc.edu/goldenPath/hg19/database/ 以下为Linux下载文件方式 wget https://hgdownload.cse.ucsc.edu/goldenPath/hg19/database/snp151.sql wget -c -…

[ASIS 2019]Unicorn shop

点入题目看见四个可购买的东西,但是都购买不了,最后一个价格大的脱俗,猜测成功买到后会得到flag,但是购买时提示操作失败只允许一个字符。查看源码发现在utf-8后面特意标注提示 涉及到了字符编码和字符集的概念: UTF-…

单机多进程,每个进程多张卡 mpi nccl 程序设计检验

做了部分注释&#xff0c;比较乱 本示例结构&#xff1a; 1&#xff0c;源代码 #include <stdlib.h> #include <stdio.h> #include "cuda_runtime.h" #include "nccl.h" #include "mpi.h" #include <unistd.h> #include <…

流量预测资源总结(不断更新)

目录 整理流量预测数据集&#xff08;1&#xff09;Telecom Italia 意大利电信 2015&#xff08;2&#xff09;City Cellular Traffic Map (C2TM) 2015&#xff08;3&#xff09;、LTE Network Traffic Data_kaggle&#xff08;4&#xff09;、Cellular Traffic Analysis Data …

Python十大实用技巧【附源码】

1、什么是Python? Python简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&#xff0c;相比其他语言经常使用英文关键字&#xff0c;其他语言的一些标点符号&#xff0c;它具有比其他语言更有特色语法结构。 …

Nacos学习思维导图

一、服务注册 参考文档&#xff1a;http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 二、服务续约 参考文档&#xff1a;http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 三、服务…

提取 PE 文件的各种信息

前段时间项目需要实现对 Windows PE 文件版本信息的提取&#xff0c;如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在 Windows 下当然有一系列的 API 函数供调用&#xff0c;简单方便。 我们先看一下PE文件结构&#xff0c;PE文件由DOS首部&#xff0…

FX3U-1PG使用

作为扩展模块的安装 伺服驱动器的参数设置 1.设置为0&#xff0c;为位置模式&#xff0c;发送脉冲控制&#xff1b; 2. 设置旋转方向&#xff0c;以及脉冲方式&#xff0c;通常设置为01&#xff0c;因为FX3U-1PG只支持正方向脉冲负方向脉冲方式&#xff1b; 当然想改变电机运…

基于AT89C51单片机可做实物的温度烟雾火灾报警设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88658141?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤02 摘要 随着现代家庭用火、用电量的增加&#xff0c;家庭火灾发生的频率越来越高。火灾报警…

Cesium加载大规模三维数据渲染性能优化方案

根据实际项目经验和近期的论文&#xff0c;总结一下Cesium加载大规模三维数据性能优化方法。个人认为在实际的GIS数字孪生项目中,其可行的优化手段主要有三种&#xff1a; &#xff08;1&#xff09;通过专业的转换工具CesiumLab等对原始的三维模型进行轻量化处理&#xff0c;包…
最新文章