C++面试指南——类常用知识点概念总结(附C++进阶视频教程)

news2024/12/23 2:01:37

构造函数

  1. 构造函数可以抛出异常,可以重载,如果在实例化时在类名后面加个括号,只是创建了一个匿名的对象。构造不能是虚函数,因为此时虚函数表还没有初始化。new对象会调解构造函数。
  2. 没有定义拷贝构造时,IDE会自动生成一个默认拷贝构造函数。当以值传递的类方式调用函数时,如果实参为对象,会调用拷贝构造函数。函数以值的方式返回对象时,vs会调用拷贝构造,g++则不会,默认拷贝属于浅拷贝
  3. 深拷贝:将原有对象的所有成员变量和持有内存都拷贝给新对象,并为新对象分配一块内存。原有对象和新对象所持有的动态内存是相互独立的。STL的容器都使用了深拷贝
  4. 浅拷贝:动态分配的内存时,指向其他数据的指针等,默认的拷贝构造函数就不能拷贝这些资源了

 注:当类有指针类型的成员变量,就需要深拷贝

静态成员变量

  1. static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。没有在类外初始化的 static 成员变量不能使用。
  2. static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。所有的对象都共享这些静态成员变量。

静态成员函数

  1. 每个对象有各自的一份普通成员变量,但是静态成员变量只有一份,被所有对象所共享。静态成员函数不具体作用于某个对象。即便对象不存在,也可以访问类的静态成员。静态成员函数内部不能访问非静态成员变量,也不能调用非静态成员函数。
  2. 静态成员函数内部不能出现 this 指针

this指针

  • 其实在C++中。在定义类的成员函数时,是隐藏了一个参数的,该参数的定义为 const Name1* this,C++编译器根据不同的this指针执行不同对象的操作。

析构函数

  1. 没有参数,不能重载,不能抛出异常,内联。没有定义时,系统会默认生成一个析构函数。如果使用默认析构时,默认析构执行完成之后,会调用成员变量的析构,之后又调用派生类的析构,代码量会变大。会自动调用,也可以手工调用。
  2. 到析构时,虚函数表已初始化,可以把析构放在虚函数表里面来来调用。
  3. 当子类指针指向子类时,delete时基类和子类都会被释放。(  SubClass* pObj = new SubClass();delete pObj;)
  4. 当基类指针指向子类时,若析构函数是虚函数(加上virtual关键词),delete时基类和子类都会被释放。若析构函数不是虚函数delete时只释放基类,不释放子类,会造成内存泄漏问题。(BaseClass* pObj = new SubClass();delete pObj;)

虚函数

  1. 虚函数唯一用处就是构成多态:在运行时才可以明确调用对象,根据传入的对象类型来调用函数,例如当使用基类指针指向派生类对象时,能够调用派生类的成员函数,如果不是虚函数,调用的则是基类自己的成员函数。
  2. 构造函数不能是虚函数:虚函数的调用是通过虚函数表来查找,虚函数是对象构造后生成的。
  3. 内联函数不能是虚函数:inline属于是静态编译的。而虚函数是动态调用的,在编译器并不知道需要调用的是父 类还是子类的虚函数,所以不能够inline声明展开。
  4. 静态成员函数不能是虚函数:因为没有this指针。虚函数依靠虚函数函数指针和虚函数表来处理。虚函数指针在类的构造函数中创建生成,并且只能用this指针来访问它。对于静态成员函数,它没有this指针,所以无法访问虚函数. 
  5.  final :修饰虚函数,表示该虚函数不能再被重写;修饰类,该类不能被继承。
  6. override:override写在子类中,要求严格检查是否完成重写,如果没有完成重写就报错。

纯虚函数 

  •     纯虚函数是一个抽象的接口,没有默认的实现,用=0赋值。

多态

  1. 多态:是指同一个名字的事物能完成不同的功能,C++中可以分编译时多态(函数重载、运算符重载、按实参调用重载函数)和运行时多态。
  2. 运行时多态:虚函数让基类指针指向基类对象时就使用基类的成员,指向派生类对象时就使用派生类的成员。
  3. 多态的目的:可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如果没有多态,只能访问成员变量。
  4. 构成多态:必须存在继承关系,继承关系中必须有同名的虚函数,并且它们是覆盖关系(函数原型相同),存在基类的指针,通过该指针调用虚函数。
  5. 协变:子类重写父类虚函数时,与父类虚函数返回值类型不同。

单继承

  1.  继承方式:公有继承public 仍为public ,protected为protected。保护继承public 仍为protected ,protected为protected。私有继承public 仍为private,protected为private。所有继承方式private都不能用。基类的 private 成员是能够被继承的,并且(成员变量)会占用派生类对象的内存,它只是在派生类中不可见。类的构造函数不能被继承。(基类对派生类隐藏基类的实现,以体现面向对象的封装性。)
  2. 派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。所以基类成员函数和派生类成员函数不构成重载。
  3. 派生类对继承过来的成员变量要构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。所以在派生类的构造中调用基类的构造。
  4. 创建对象时,首先调用基类的构造,其次调用派生类的构造。派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。( C->B->A,A的构造被隐显的调用两次,浪费cpu时间,所以禁止。)
  5. 析构函数不能被继承。在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数。
  6. 创建派生类对象时,构造函数的执行顺序和继承顺序相同,即先执行基类构造函数,再执行派生类构造函数。而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构函数,再执行基类析构函数。

多继承

  1. 多继承时,派生类的构造函数中调用多个基类的构造函数。基类构造函数的调用顺序和和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类出现的顺序相同。
  2. 多继承时,当两个或多个基类中有同名的成员时,会产生命名冲突,要在成员名字前面加上类名和域解析符::,以显式地指明到底使用哪个类的成员,消除二义性。

虚继承

  1.  为了解决多继承命名冲突和冗余数据问题,在派生类中只保留一份间接基类的成员,虚继承的目的是让某个类(虚基类)做出声明,承诺愿意共享它的基类。不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。
  2. 虚派生只影响从指定了虚基类的派生类中进一步派生出来的类,它不会影响派生类本身。因为在虚继承的最终派生类中只保留了一份虚基类的成员,所以该成员可以被直接访问,不会产生二义性。此外,如果虚基类的成员只被一条派生路径覆盖,那么仍然可以直接访问这个被覆盖的成员。但是如果该成员被两条或多条路径覆盖了,那就不能直接访问了,此时必须指明该成员属于哪个类。
  3. 虚基类是由最终的派生类初始化,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。

类的内存

成员函数

  • 成员函数是不占用对象的内存空间的,只有成员变量占用对象的内存空间,在实例时,是按照类的成员变量所占用的总字节数申请内存(满足内存对齐)

虚函数

  1. 当一个类包括虚函数时,该类自动包含一个指向虚函数vptr指针,虚函数表中存放了指向该类中定义的所有虚函数的指针(函数指针),可以通过vptr快速访问到虚函数。
  2. 派生类没有重写基类的虚函数,没有继承基类的 vptr 指针,进行多态操作时,如果调用派生类的虚函数(与基类同名的虚函数),是不会发生多态行为的,调用的仍然是基类的虚函数。
  3. 派生类重写了基类的虚函数,编译器给重写的虚函数重新分配了内存空间,在进行多态操作时,如果调用派生类的虚函数,那就会发生多态行为,调用的就会是派生类的虚函数!
  4. 派生类重写了基类的部分虚函数,重写的部分是派生类。

内存

  1.  对象所占用的存储空间的大小等于各成员变量所占用的存储空间的大小之和(内存对齐)
  2. 当内存使用完之后,会使用虚拟内存,也就是往硬盘里面写,之后程序会被杀掉。

视频教程

链接:https://pan.baidu.com/s/1W0cfUPxnf9c8egzMm1rBVA  提取码:jpy3 
 

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

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

相关文章

宝塔面板安装配置MySQL,轻松管理数据库【公网远程访问】

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar内网穿透4. 创建HTTP隧道映射mysql端口5.远程连接6.固定TCP地址6.1 保留一个固定的公网TCP端口地址6.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单…

软件测试常规测试过程模型——V模型与X模型

一、V模型简单介绍及讲解 V模型是软件测试过程模型中最广为人知的模型,尽管很多富有实际经验的测试人员还是不太熟悉V模型,或者其它的模型。V模型中的过程从左到右,描述了基本的开发过程和测试行为。V模型的价值在于它非常明确地标明了测试过…

SpringBoot整合Minio,一篇带你入门使用Minio

本文介绍SpringBoot如何整合Minio,解决文件存储问题 文章目录 前言环境搭建项目环境搭建添加依赖库yml配置 Docker安装minio 代码实现MiniConfigservicecontroller 测试 前言 参考链接: 官网 环境搭建 项目环境搭建 将minio单独封装成一个module&am…

安全代码审计实施标准学习笔记

声明 本文是学习GB-T 39412-2020 信息安全技术 代码安全审计规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 资源使用安全缺陷审计列表 资源管理 审计指标:应避免重复释放资源。 审计人员应检查代码是否存在重复释放资源的情况。重…

Opencv+Python笔记(九)模板匹配

模板匹配 模板匹配常用于对象检测,且实现简单计算效率高。但如果输入图像中存在变化因素如旋转、缩放、视角变化等,模板匹配很容易失效 模板匹配原理: 1.匹配方式为模板 (a * b) 在原图像 (m * n) 上滑动 使用参数method中指定的方法&#…

云原生(docker+k8s+阿里云)

Gitee-Kubernetes学习 kubectl备忘清单 k8s官方文档-task [云原生-kubectl命令详解] ingress详解 ingress官方文档 云原生-语雀-架构师第一课 如上图,服务器有公网ip和私网ip,公网ip是外部访问服务器用的,重启一次实例就变化了,如…

常用数据结构与颜色空间

常用数据结构与颜色空间 矩阵和图像类型 图像可能是灰度,彩色,4 通道的(RGBalpha),其中每个通道可以包含任意的整数或浮点数。因此,该类型比常见的、易于理解的3通道 8位 RGB 图像更通用。 RBG颜色空间、 HSV/HLS颜色空间、 Lab…

Blender 3.5 面的操作(二)

目录 1. 面操作1.1 面的切割1.2 整体切分1.3 面的法向1.4 正面、背面1.5 翻转法向1.6 填充面1.7 X-Ray 透视模式 1. 面操作 1.1 面的切割 切割工具 Knife,快捷键 k 选中一个面 按k键,进入切割工具(建议使用快捷键切割)&#xff…

crossover可以安装什么软件?支持的软件列表

CrossOver是一款可以在Mac和Linux等操作系统上运行Windows软件,而无需在计算机上安装Windows操作系统。这款软件的核心技术是Wine,它是一种在Linux和macOS等操作系统上运行Windows应用程序的开源软件。本文将会对CrossOver进行详细介绍,并回答…

“SCSA-T学习导图+”系列:IPSec VPN原理与应用

本期引言: 本章主要讲解IPSec VPN相关理论概念,工作原理。从安全和加密原理入手,讲解了IPSec 在VPN对等体设备实现的安全特性,如数据的机密性、数据的完整性,数据验证等。重点分析IPSec封装模式,IPSec安全…

技术解读丨多模数据湖:助力AI技术,推动内容管理平台智能化升级

随着数字化时代的到来,数据已经成为企业的重要资产之一。因此,构建高效的内容管理平台变得至关重要。本文重点介绍SequoiaDB多模数据湖技术在内容管理平台中的应用和成效,以及其对企业非结构化数据管理和AI的推动作用。 随着数字化时代的到来…

Vue3技术6之toRef和toRefs、shallowReactive与shallowRef、readonly与shallowReadonly

Vue3技术6 toRef和toRefstoRefApp.vueDemo.vue toRefsApp.vueDemoTwo.vue 总结 shallowReactive与shallowRefshallowReactiveApp.vueDemo.vue shallowRefDemo.vue 总结 readonly与shallowReadonlyApp.vueDemo.vueDemoTwo.vue总结 toRef和toRefs toRef App.vue <template&…

SpringCloud入门实战(七)-Hystrix服务限流

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术&#xff0c;都可以先去官网先看看&…

电子行业数字工厂管理系统的生产管理模式是什么

随着电子行业的不断发展&#xff0c;数字工厂管理系统在生产管理中的应用越来越广泛。数字工厂系统是一种综合管理系统&#xff0c;它将企业的采购、生产、销售、财务、人力资源等多个方面进行整合&#xff0c;实现了企业资源的有效整合和管理效率的提升。电子行业数字工厂系统…

vue 使用 threejs 加载第三方模型

threejs 加载第三方模型 接专栏的上一篇博文&#xff0c;这是加载第三方模型相关的。这篇博文拖了很久了哈&#xff0c;简单说一下吧&#xff0c;本来不想写了的&#xff0c;觉得相对来说比较简单&#xff0c;但是还是稍微一扯。为啥要加载第三方呢&#xff0c;上一篇我们绘制的…

人工智能:技术的进步与未来展望

一、引言 1.人工智能的定义 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是指由人类创造的具有某种程度上模拟、延伸或超越人类智能的技术。AI技术使计算机能够从数据中学习、推理、适应并执行类似人类大脑所进行的任务。这些任务包括图像识别、…

【Linux命令行与Shell脚本编程】三,Linux文件系统

Linux命令行与Shell脚本编程 第三章 Linux文件系统 文章目录 Linux命令行与Shell脚本编程三.Linux文件系统3.1,查看文件3.1.1,ls 命令 选项和参数3.1.2,过滤输出列表 3.2, 处理文件3.2.1,touch 创建文件3.2.2,cp 复制文件cp -i 覆盖询问cp -R 递归cp命令中使用通配符 3.2.3,ta…

NFS网络文件共享服务

NFS网络文件共享服务 NFS&#xff08;network file system&#xff09;网络文件系统 可以把对方主机资源直接挂载到自己电脑上&#xff0c;比FTP更加方便 明文传输 没有认证机制 安全性很差 只在局域网使用 依赖RPC(远程过程调用&#xff09; 需要安装nfs-utils(提供NFS服务)…

对话西门子Mendix:低代码与亚马逊云科技Serverless的底层融合,助力企业提效降本...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 3月30日 亚马逊云科技举办了主题为“全面拥抱Serverless时代”的创新大会&#xff0c;分享了亚马逊云科技17年引领Serverless发展的技术创新、应用场景以及全球客户的创新实践。 会上&#xff0c;亚马逊云科技大中华区产品部…

RocketMQ高级概念

一 RocketMQ核心概念 1.消息模型&#xff08;Message Model&#xff09; RocketMQ主要由 Producer、Broker、Consumer 三部分组成&#xff0c;其中Producer 负责⽣产消息&#xff0c;Consumer 负责消费消息&#xff0c;Broker 负责存储消息。Broker 在实际部署过程中对应⼀台…