C++ 初阶总复习 (16~30)
C++ 初阶总复习 (16~30)
- 目的
- 16. 2009. volatile关键字的作用
- 17. 2010.什么是多态 简单介绍下C++的多态
- 18. 2011. 什么是虚函数 介绍下C++中虚函数的原理
- 19. 2012 构造函数可以是虚函数嘛
- 20. 2013.析构函数一定要是虚函数嘛?
- 21. 2015. 什么是C++中的虚继承
- 22. 2016. 什么是C++函数重载 它的优点是什么 和重写有什么区别
- 23. 2017.什么是C++的重载运算符
- 24. C++中struct和class的区别
- 25. 2021. C++中enum和enum class的区别
- 26. 2022. C++中new和malloc的区别 free和delete的区别
- 27. 2023.C++中this指针的作用
- 28. 2024. 可以使用delete this嘛
- 29. 2025. C++中memcpy和memmove有什么区别
- 30. 2036. C++中使用模块的优缺点
目的
写这一系列文章的目的主要是为了秋招时候应对计算机基础问题能够流畅的回答出来 (如果不整理下 磕磕绊绊的回答会被认为是不熟悉)
本文章题目的主要来源来自于 面试鸭
部分面试鸭上没有而牛客网上有的博主会进行查缺补漏
题目编号按照面试鸭官网题号方便大家寻找
题解大部分是博主根据自己之前的博客再加上部分网上的内容进行口语化的表述 如果涉及到省略的部分博主会提供自己或者其他人的博客链接
题目会按照由简单到难进行更新
16. 2009. volatile关键字的作用
回答
volatile关键字的作用是保持内存的可见性
比如说有这么一段代码 int a = 0
但是后面没有对于a进行修改的操作了 那么编译器就会认为 a 的值就是 0 将他放到寄存器中 而不用内存中的数值
但是如果在别的文件中使用了extern 修改了a的值 那么这时候程序就会出错了
17. 2010.什么是多态 简单介绍下C++的多态
参考博客
C++多态
回答
多态就是函数调用的多种形式 使用多态能够使得不同的对象去完成同一件事时 产生不同的动作和结果
在C++中多态有两种形式 一种是静态多态 一种是动态多态
静态多态在C++中的表现形式是函数重载
动态多态在C++中的表现形式是虚函数+继承
18. 2011. 什么是虚函数 介绍下C++中虚函数的原理
参考博客
多态原理
虚函数就是被virtual关键字修饰的函数
我们可以做个试验 一个类中有一个int类型的数据的时候 我们使用sizeof计算对象的大小 可以发现对象的大小是4 (类中的函数是存放在公共区域的 不计入对象的大小)
可以如果我们函数中有一个虚函数 那么这个对象的大小就会变为8 多出了四个字节 这是为什么呢?
这里其实是因为有了虚函数中对象中就会多出一个虚函数指针 (相同的类共用一个虚函数指针)
这个虚函数指针指向一个叫做虚表的东西 虚表里面存放着虚函数的地址 我们通过虚表找到函数地址来调用函数
而父类和子类的虚函数指针不同 指向的虚表也不同 所以说这也就是为什么动态多态在原理层面叫做覆盖的原因
虚表是什么阶段初始化的 存放在哪里?
虚表是构造函数列表初始化阶段初始化的 它和普通函数一样 都存放在代码段
为什么对象不能构成多态
因为我们在使用指针和引用的时候 会发生一种叫做切片的过程 本质上得到是子类从父类那里派生过去的一部分 这个时候父类还是用的父类的虚指针和虚表 子类同理
但是对象的话我们就是直接拷贝了 本质上是同一个类 同一个虚函数 自然不构成多态
静态多态和动态多态的时机
静态多态发生在编译阶段 动态多态发生在运行阶段
19. 2012 构造函数可以是虚函数嘛
参考博客同上
回答
不行 因为虚函数表生成的时机是在构造函数列表初始化的时候 如果构造函数变成了虚函数 这不就变成了先有鸡还是先有蛋的问题了嘛
20. 2013.析构函数一定要是虚函数嘛?
参考博客同上
回答
析构函数不一定是虚函数 但是析构函数我们推荐设置为虚函数
主要是为了应对这种情况
两个父类的指针一个指向子类一个指向父类
当我们调用析构函数的时候 如果说没有写成虚函数 那么就会调用两次父类的析构函数 造成内存泄漏的情况
析构函数的名字会被统一处理成destructor();
21. 2015. 什么是C++中的虚继承
参考博客 继承概念详解
回答
虚继承主要是为了解决C++中 多继承时的菱形继承的问题
比如说学生类和老师类继承于人类 然后用户类继承于学生类和老师类
但是由于学生类和老师类都继承了人类中姓名 那么我们使用用户类调用姓名这个参数的时候 到底是调用的哪个? (当然 这个能通过限定作用域的方式来解决)
此时我们使用学生类和老师类虚继承人类 就不会发生这个问题了
虚继承解决二义性问题的原理是什么?
当我们使用虚继承的时候 原来存放姓名变量的两个地方会变成存放一个指针 该指针指向一个地址 就是如今存放姓名这个变量的地址 如此就不会出现二义性的问题了
22. 2016. 什么是C++函数重载 它的优点是什么 和重写有什么区别
C++函数重载就是函数参数个数不同 类型不同 顺序不用的函数 在传入不同参数的时候会发生不同的效果
它也被称为静态多态
原理就是C++编译器将函数和参数作为一个函数的链接符号 而C语言只考虑函数名
它的优点是 增强代码的可读性 我们为了实现不同的效果去使用不同的函数名
它和重写的区别是
- 一个是编译期间就确定 一个是运行时才确定
- 一个必须要求在父类和子类中 一个不用
- 重载要求参数不同 而重写要求参数相同 (协变除外)
什么是协变
父类和子类的返回值要构成多态理论上必须相同 但是有一种特殊情况
协变
协变的返回值必须是基类或者派生类的指针或引用
23. 2017.什么是C++的重载运算符
参考博客
C++重载运算符
对于一些运算符进行重载 比如说我们写一个日期类 日期类的++我们就可以重载为天数加一这种形式
不过有五个运算符不能被修改
.* :: sizeof ?: . (第一个基本上遇不到,第二个到第五个解释:域作用限定符、sizeof、选择、成员对象结构体访问符号)
24. C++中struct和class的区别
参考博客
类和对象详解
- 为了兼容C语言 struct可以定义结构体 class不可以
- 为了兼容C语言 struct的默认访问符号为public 而class的默认访问符为private
25. 2021. C++中enum和enum class的区别
回答
他们之间的区别主要是 一个是更加安全的 一个是相对不安全的
- enum枚举的类型 我们可以直接用 不包含作用域 而enum class则必须包含作用域
- enum可以进行隐式的类型转换 enum class则不行
26. 2022. C++中new和malloc的区别 free和delete的区别
参考博客
内存精讲
他们的区别如下 其实new和malloc 和free和delete可以用一套模板来答题 这里就只写一个的了
- new是操作符 malloc是函数
- new创建对象的时候会开辟空间和启用构造函数 malloc只会开辟空间
- new的底层是malloc
- malloc申请空间的时候 需要手动计算大小 而new只需要传递类型即可
27. 2023.C++中this指针的作用
参考博客
类和对象详解
回答
this指针是一个隐藏参数 它存在于每个类的非静态成员函数中
它的主要作用是访问类的成员变量和成员函数
比如说 我们定义两个对象 d1 d2 他们同时调用print函数 那么编译器怎么知道是要调用哪个函数呢? 这里实际上就是this指针在发挥作用
this指针可以为空 当只用this指针调用函数的时候 系统就不会报错 当然调用对象就不行了
(当然这里实际上是编译器优化成了 类 ::函数的形式 还是不建议这样写)
28. 2024. 可以使用delete this嘛
理论上是可以的 但是实际上我们并不介意这么使用 它的主要作用是允许对象在成员函数中进行销毁
29. 2025. C++中memcpy和memmove有什么区别
参考博客
内存函数
这两个函数都是将源目标的数据复制到指定目标
但是memmove更加安全 因为即使有重叠区域 memmove也能更好的处理
那么memmove是如何处理的呢?
简单来说就是比较地址的大小 选择一种不会脏数据的方式进行复制
30. 2036. C++中使用模块的优缺点
参考博客
模板初阶
优点
- 提高代码复用性 允许我们编写和类型无关的代码
- stl的基石
- 高性能 编译器件就确定 减少了运行时的消耗
- 类型安全 它会在编译期间进行检查 减少错误的发生
缺点
- 编译时间增加
- 报错信息增加 难以定位错误
- 代码膨胀
- 可读性和维护性下降
相关文章:
C++ 初阶总复习 (16~30)
C 初阶总复习 (16~30) 目的16. 2009. volatile关键字的作用17. 2010.什么是多态 简单介绍下C的多态18. 2011. 什么是虚函数 介绍下C中虚函数的原理19. 2012 构造函数可以是虚函数嘛20. 2013.析构函数一定要是虚函数嘛?21. 2015. 什么是C中的虚…...
Koordinator-Metric查询
以CollectAllPodMetricsLast()举例,看看koordinator怎样使用tsdb进行查询。 CollectAllPodMetricsLast() GenerateQueryParamsLast()传入metric采集间隔2倍时间调用CollectAllPodMetrics()func CollectAllPodMetricsLast(statesInformer statesinformer.StatesInformer, metr…...
人工智能图像识别Scala介绍
Scala 一.Scala 简介 Scala即Scalable Language(可伸缩的语言),Scala 语言是由 Martin Odersky 等人在 2003 年开发的,并于 2004 年首次发布。意味着这种语言设计上支持大规模软件开发,是一门多范式的编程语言。 Sc…...
PCL 点云多平面探测
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里实现了一种点云多平面探测的算法,该算法使用基于鲁棒统计的方法进行平面补丁检测。该算法具体过程:首先将点云细分为更小的块(使用二分法),然后尝试为每个点云块匹配一个平面。如果平面通过了鲁棒平面性测试…...
npm i 出现的网络问题
npm i 出现的网络问题 解决方案: npm config list 查看.npmrc文件中是否配置了proxy删除.npmrc文件中的proxy,保存。重新执行npm i命令。 顺便说说解决这个问题的心里路程 每次安装vue的环境的时候,经常遇到npm安装一些插件或者是依赖的时…...
C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因
文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案:手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集(0条记录)复制到Excel时崩溃的原因及解决方法如下: 原因分析 空记录集…...
代码随想录算法训练营--打卡day3
复习:标注感叹号的需要在电脑上重新做几遍 一.两两交换链表中的节点!! 1.题目链接 24. 两两交换链表中的节点 - 力扣(LeetCode) 2.思路 画图 3.代码 class Solution {public ListNode swapPairs(ListNode head) …...
c#的.Net Framework 的console 项目找不到System.Window.Forms 引用
首先确保是建立的.Net Framework 的console 项目,然后天健reference 应用找不到System.Windows.Forms 引用 打开对应的csproj 文件 在第一个PropertyGroup下添加 <UseWindowsForms>true</UseWindowsForms> 然后在第一个ItemGroup 下添加 <Reference Incl…...
蓝桥杯嵌入式学习笔记
用博客来记录一下参加蓝桥杯嵌入式第十六届省赛的学习经历 工具环境准备cubemx配置外部高速时钟使能设置串口时钟配置项目配置 keil配置烧录方式注意代码规范头文件配置 模块ledcubemx配置keil代码实现点亮一只灯实现具体操作的灯,以及点亮还是熄灭 按键cubemx配置k…...
zookeeper详细介绍以及使用
Zookeeper 是一个开源的分布式协调服务,提供了一个高效的分布式数据一致性解决方案。它的主要作用是维护集群中各个节点之间的状态信息,协调节点之间的工作,并处理节点宕机等故障情况。Zookeeper 的核心功能包括数据发布/订阅、分布式锁、集群…...
Blender多摄像机怎么指定相机渲染图像
如题目所说,当blender的场景里面有摄像机的时候,按F12可以预览渲染结果,但是当有多个摄像机的时候就不知道使用哪个进行渲染了。 之前在网上没有找到方法,就用笨方法,把所有的摄像机删除,然后设置自己需要…...
Redis场景问题1:缓存穿透
Redis 缓存穿透是指在缓存系统(如 Redis)中,当客户端请求的数据既不在缓存中,也不在数据库中时,每次请求都会直接穿透缓存访问数据库,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。下面为…...
CSS 如何设置父元素的透明度而不影响子元素的透明度
CSS 如何设置父元素的透明度而不影响子元素的透明度 在 CSS 中,设置父元素的透明度(如通过 opacity 属性)会影响所有子元素的透明度,因为 opacity 是作用于整个元素及其内容的。如果想让父元素透明但不影响子元素的透明度&#x…...
Java的string默认值
在Java中,String类型的默认值取决于其定义和实例化的方式。 以下是关于String默认值的详细说明 未实例化的String变量 如果定义一个String变量但未对其进行实例化(即未使用new关键字或直接赋值),其默认值为:ml-search[null]。这…...
从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?
小T导读:TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用…...
观察者模式:解耦对象间的依赖关系
观察者模式:解耦对象间的依赖关系 JDK 中曾直接提供对观察者模式的支持,但因其设计局限性,现已被标记为“过时”(Deprecated)。不过,观察者模式的思想在 JDK 的事件处理、spring框架等仍有广泛应用。下面我…...
windows第二十章 单文档应用程序
文章目录 单文档定义新建一个单文档应用程序单文档应用程序组成:APP应用程序类框架类(窗口类)视图类(窗口类,属于框架的子窗口)文档类(对数据进行保存读取操作) 直接用向导创建单文档…...
通信协议之串口
文章目录 简介电平标准串口参数及时序USART与UART过程引脚配置 简介 点对点,只能两设备通信只需单向的数据传输时,可以只接一根通信线当电平标准不一致时,需要加电平转换芯片(一般从控制器出来的是信号是TTL电平)地位…...
Java入门知识总结——章节(二)
ps:本章主要讲数组、二维数组、变量 一、数组 数组是一个数据容器,可用来存储一批同类型的数据 🔑:注意 类也可以是一个类的数组 public class Main {public static class Student {String name;int age; // 移除 unsignedint…...
Verilog 中寄存器类型(reg)与线网类型(wire)的区别
目录 一、前言 二、基本概念与分类 1.寄存器类型 2.线网类型 三、六大核心区别对比 四、使用场景深度解析 1.寄存器类型的典型应用 2. 线网类型的典型应用 五、常见误区与注意事项 1. 寄存器≠物理寄存器 2.未初始化值陷阱 3.SystemVerilog的改进 六、总结 …...
基于华为设备技术的端口类型详解
以下是基于华为设备技术网页的端口类型详解(截至2025年3月): 一、Access端口 定义:仅允许单个VLAN通过,用于连接终端设备(如PC、打印机) 处理流程: 接收帧:未带标签…...
DFS飞机降落
问题描述 NN 架飞机准备降落到某个只有一条跑道的机场。其中第 ii 架飞机在 TiTi 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 DiDi 个单位时间,即它最早可以于 TiTi 时刻开始降落,最晚可以于 TiDiTiDi 时刻开始降落。降落…...
Scikit-learn全攻略:从入门到工业级应用
Scikit-learn全攻略:从入门到工业级应用 引言:Scikit-learn在机器学习生态系统中的核心地位 Scikit-learn作为Python最受欢迎的机器学习库,已成为数据科学家的标准工具集。根据2023年Kaggle调查报告,超过83%的数据专业人士在日常工作中使用Scikit-learn。本文将系统性地介…...
Business Trip and Business Travel
Business Trip and Business Travel References Background I would like to introduce the background. Dave is going on a business trip, but he’s very busy, so he needs Leo’s help to buy the plane ticket. Panda is an agent of China Eastern /ˈiːstərn/ Airl…...
【Linux加餐-验证UDP:TCP】-windows作为client访问Linux
一、验证UDP-windows作为client访问Linux UDP client样例代码 #include <iostream> #include <cstdio> #include <thread> #include <string> #include <cstdlib> #include <WinSock2.h> #include <Windows.h>#pragma warning(dis…...
Appium Inspector使用教程
1.下载最新版本 https://github.com/appium/appium-inspector/releases 2.本地启动一个Appium服务 若Android SDK已安装Appium服务,则在任意terminal使用appium启动服务即可 3.Appium Inspector客户端配置连接到Appium服务 Configuring and Starting a Session…...
Rust vs. Go: 性能测试(2025)
本内容是对知名性能评测博主 Anton Putra Rust vs. Go (Golang): Performance 2025 内容的翻译与整理, 有适当删减, 相关数据和结论以原作结论为准。 再次对比 Rust 和 Go,但这次我们使用的是最具性能优势的 HTTP 服务器库---Hyper,它基于 Tokio 异步运…...
第三卷:覆舟山决战(73-108回)正反人物群像
第三卷:覆舟山决战(73-108回)正反人物群像 核心矛盾:寒门称帝→权力异化→历史循环 主题:通过人物群像展现屠龙者成魔的必然性与制度压迫的永恒性 一、正派阵营(理想主义残余) 1. 檀道济&…...
JDBC的详细使用
1. JDBC概述 JDBC[Java Database Connectivity]是 Java 语言中用于连接和操作数据库的一套标准 API。它允许 Java 程序通过统一的方式与各种关系型数据库,如 MySQL、Oracle、SQL Server 等交互,执行 SQL 语句并处理结果。 1.1 JDBC原理 JDBC的核心原理…...
瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用笔记
一、源码 官方在librga中给了很多 demo 以供参考,例如 imresize 操作: /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…...
