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

news2024/12/26 9:20:13
  • 目录
    • 《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.coloradmin.cn/o/1353101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt .pro工程转vs工程

1. 新建vs空项目或者Qt Console Application; 2. 扩展 -》Qt VS Tools -》Open Qt Project (.pro) 打开对应的pro文件即可将.pro工程转成vs工程; 注意: (1)转成的vs工程在pro文件同级目录下,双击打开vcx…

完善 Golang Gin 框架的静态中间件:Gin-Static

Gin 是 Golang 生态中目前最受用户欢迎和关注的 Web 框架,但是生态中的 Static 中间件使用起来却一直很不顺手。 所以,我顺手改了它,然后把这个改良版开源了。 写在前面 Gin-static 的改良版,我开源在了 soulteary/gin-static&a…

第二十五章 JDBC 和数据库连接池

一、JDBC 概述(P821) 1. 基本介绍 (1)JDBC 为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。 (2)Java 程序员使用 JDBC,可以连接任何提供了 JDBC 驱动程序的数据库系统…

【网络技术】【Kali Linux】Wireshark嗅探(六)地址解析协议(ARP)

一、实验目的 本次实验使用Wireshark流量分析工具进行网络嗅探,旨在了解地址解析协议(ARP)的工作原理。 二、ARP协议概述 地址解析协议(Address Resolution Protocol, ARP)位于网络层(IP层)&…

金和OA SAP_B1Config.aspx存在未授权访问漏洞

产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统升开发平台,电子政务一体化平台智慧电商平合等服务 漏洞概述 金和OA SAP_B1Config.aspx存在未授权访问漏洞,攻击…

看完,你还会学鸿蒙吗?

是不是前端程序员的春天,我们可以分析鸿蒙现在的市场和布局。其实不仅仅只是前端,还有Android、Java、Python等等开发人员都可以把鸿蒙当做新的出路。 2024年程序员为什么一定要学鸿蒙? 首先,鸿蒙作为一个新系统的出现。它的结构…

Android studio BottomNavigationView 应用设计

一、新建Bottom Navigation Activity项目&#xff1a; 二、修改bottom_nav_menu.xml: <itemandroid:id"id/navigation_beijing"android:icon"drawable/ic_beijing_24dp"android:title"string/title_beijing" /><itemandroid:id"i…

test ui-04-testcomplete 入门介绍

About TestComplete TestComplete是一款适用于各种应用程序类型和技术的自动化测试环境&#xff0c;包括&#xff08;但不限于&#xff09;Windows、.NET、WPF、Visual C、Visual Basic、Delphi、CBuilder、Java以及Web应用程序和服务。 TestComplete既适用于功能测试&#x…

线程的深入学习(一)

前言 前面文章讲述了线程的部分基本知识&#xff0c;这篇是对线程的深入学习&#xff0c;包含线程池&#xff0c;实现框架等。 1.学习如何使用Executor框架创建线程池。 2.并发工具类如CountDownLatch、CyclicBarrier等。 3.线程安全和并发集合&#xff1a; 4.学习如何使用Jav…

python入门第一讲:认识python

目录 什么是计算机 什么是编程 编程语言有哪些 python是咋来的 python能干啥 python的优缺点 什么是计算机 什么叫计算机&#xff0c;当你把问这个问题问家里的老人的时候&#xff0c;他们很可能指着计算器告诉你说&#xff0c;这个就是计算机&#xff0c;这个很明显&am…

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

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

HubSpot电子邮件自动化的关键功能和流程!

HubSpot提供了强大的电子邮件自动化工具&#xff0c;使用户能够创建、执行和跟踪复杂的电子邮件市场营销活动。以下是HubSpot电子邮件自动化的一些关键功能和流程&#xff1a; 1.电子邮件工作流程&#xff08;Email Workflows&#xff09;&#xff1a; 用户可以使用HubSpot的工…

Lumerical Script------for语句

Lumerical------for语句 正文正文 关于 Lumerical 中 for 语句的用法这里不做过多说明了,仅仅做一个记录,具体用法如下: 通常我们用的比较多的形式是第一种步长值为 1 的情况。对于其他步长值的情况,我们可以使用第二种用法。对于 while 的类似使用方法可以使用第三种。 …

2_并发编程同步锁(synchronized)

并发编程带来的安全性同步锁(synchronized) 1.他的背景 当多个线程同时访问&#xff0c;公共共享资源的时候&#xff0c;这时候就会出现线程安全&#xff0c;代码如&#xff1a; public class AtomicDemo {int i0;//排他锁、互斥锁public void incr(){ //synchronizedi; …

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

“Allins 正在通过全新的 AMM 方案为BRC20及多链铭文资产拓展 DeFi 场景&#xff0c;官网的全新上线意味着铭文资产的交易正式进入 AMM 时代。” 在 2023 年 1 月开始&#xff0c; Ordinals 协议的推出成为了铭文赛道发展的开端&#xff0c;并为比特币这类非图灵完备的生态&…

虾皮马来站点选品:在虾皮(Shopee)5个热门品类和市场特点

在虾皮&#xff08;Shopee&#xff09;马来西亚站点选择商品时&#xff0c;卖家应该考虑一些热门品类和市场特点&#xff0c;以确保他们的产品能够满足当地消费者的需求并取得良好的销售业绩。以下是在虾皮&#xff08;Shopee&#xff09;马来西亚站点销售商品时需要考虑的五个…

大模型实战营第二期——1. 书生·浦语大模型全链路开源开放体系

文章目录 1. 实战营介绍2. 书生浦语大模型介绍2.1 数据2.2 预训练2.3 微调2.4 评测2.5 部署2.6 智能体(应用) 1. 实战营介绍 github链接&#xff1a;https://github.com/internLM/tutorialInternLM&#xff1a;https://github.com/InternLM书生浦语官网&#xff1a;https://in…

c 编码(进行中)

编码出来的jpeg图片只有红&#xff0c;绿色。排查中 ​​​​​​​ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #in…

nestjs入门教程系列(三):动态路由到底该怎么用

如何获取前端请求中的参数 引子 我们在处理前端发送过来的请求时&#xff0c;需要访问客户端的request信息&#xff0c;那么我们该怎么操作呢?由于nestjs提供对底层平台的访问即express&#xff0c;所以我们可以通过注入的方式来方位请求对象 TIPS:需要从nestjs/common包里…

【C程序设计】C判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…