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语言只考虑函数名

它的优点是 增强代码的可读性 我们为了实现不同的效果去使用不同的函数名

它和重写的区别是

  1. 一个是编译期间就确定 一个是运行时才确定
  2. 一个必须要求在父类和子类中 一个不用
  3. 重载要求参数不同 而重写要求参数相同 (协变除外)

什么是协变

父类和子类的返回值要构成多态理论上必须相同 但是有一种特殊情况

协变

协变的返回值必须是基类或者派生类的指针或引用

23. 2017.什么是C++的重载运算符

参考博客

C++重载运算符


对于一些运算符进行重载 比如说我们写一个日期类 日期类的++我们就可以重载为天数加一这种形式

不过有五个运算符不能被修改

.* :: sizeof ?: . (第一个基本上遇不到,第二个到第五个解释:域作用限定符、sizeof、选择、成员对象结构体访问符号)

24. C++中struct和class的区别

参考博客
类和对象详解


  1. 为了兼容C语言 struct可以定义结构体 class不可以
  2. 为了兼容C语言 struct的默认访问符号为public 而class的默认访问符为private

25. 2021. C++中enum和enum class的区别

回答


他们之间的区别主要是 一个是更加安全的 一个是相对不安全的

  1. enum枚举的类型 我们可以直接用 不包含作用域 而enum class则必须包含作用域
  2. enum可以进行隐式的类型转换 enum class则不行

26. 2022. C++中new和malloc的区别 free和delete的区别

参考博客

内存精讲


他们的区别如下 其实new和malloc 和free和delete可以用一套模板来答题 这里就只写一个的了

  1. new是操作符 malloc是函数
  2. new创建对象的时候会开辟空间和启用构造函数 malloc只会开辟空间
  3. new的底层是malloc
  4. 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++中使用模块的优缺点

参考博客

模板初阶


优点

  1. 提高代码复用性 允许我们编写和类型无关的代码
  2. stl的基石
  3. 高性能 编译器件就确定 减少了运行时的消耗
  4. 类型安全 它会在编译期间进行检查 减少错误的发生

缺点

  1. 编译时间增加
  2. 报错信息增加 难以定位错误
  3. 代码膨胀
  4. 可读性和维护性下降

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

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

相关文章

第一天 Linux驱动程序简介

目录 一、驱动的作用 二、裸机驱动 VS linux驱动 1、裸机驱动 2、linux驱动 三、linux驱动位于哪里? 四、应用编程 VS 内核编程 1、共同点 2、不同点 五、linux驱动分类 1、字符设备 2、块设备 3、网络设备 六、Linux驱动学习难点与误区 1、学习难点 …

PaddleX产线集成功能的使用整理

一、环境搭建 1.1 安装paddle-gpu 需要根据安装机器的cuda的版本,选择合适的版本进行安装 #安装paddle-gpu 官网链接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

docker-compese 启动mysql8.0.36与phpmyadmin,并使用web连接数据库

1、找一个文件夹,比如 E:\zqy\file\mysql,cd到这个目录下创建文件docker-compose.yml 2、将下面的代码块复制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’ 在构建 Spring 源码或其他基于 Gradle 的项目时,可能会遇到如下错误: Could not get unknown property withoutJclOverSlf4J for object of type org.gradle…

mcp 接freecad画齿轮

from mcp.server.fastmcp import FastMCP import freecad.gears.commands import os from freecad import app from freecad import part mcp FastMCP("Demo")mcp.tool() def create_gear(num_teeth20,height10,double_helix True):"""创建一个渐开线…

【大前端系列19】JavaScript核心:Promise异步编程与async/await实践

JavaScript核心:Promise异步编程与async/await实践 系列: 「全栈进化:大前端开发完全指南」系列第19篇 核心: 深入理解Promise机制与async/await语法,掌握现代异步编程技术 📌 引言 在JavaScript的世界中,异步编程是无…

如何排查java程序的宕机和oom?如何解决宕机和oom?

排查oom 用jmap生成我们的堆空间的快照Heap Dump(堆转储文件),来分析我们的内存占用 用可视化工具,例如java中的jhat分析Heap Dump文件 ,它分析完会通过一个浏览器打开一个可视化页面展示分析结果 根据oom的类型来调…

什么是 OLAP 数据库?企业如何选择适合自己的分析工具

引言:为什么企业需要 OLAP 数据库? 你是否曾经经历过这样的场景: 市场部门急需一份用户行为分析报告,数据团队告诉你:“数据太大了,报表要跑 4 个小时”;业务负责人在会议中提出一个临时性分析…

测试:认识Bug

目录 一、软件测试的生命周期 二、bug 一、软件测试的生命周期 软件测试贯穿于软件的生命周期。 需求分析: ⽤⼾⻆度:软件需求是否合理 技术⻆度:技术上是否可⾏,是否还有优化空间 测试⻆度:是否存在业务逻辑错误、…

综合实验2

1、sw1和sw2之间互为备份 [sw1]interface Eth-Trunk 0 (创建聚合接口) [sw1-Eth-Trunk0]trunkport g0/0/1 (将物理接口划入到聚合接口中) [sw1-Eth-Trunk0]trunkport g0/0/2 [sw2]interface Eth-Trunk 0 [sw2-Eth-T…

【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程

卸载python3后,解决了ArcGIS与python3冲突问题后,软件可以正常打开使用了 但是还是出现了问题 用ArcGIS 进行空间分析时,中间操作没有任何报错和问题,但是就是没有运行结果 在别人的软件上操作一遍可以出现运行结果 关闭确有这个,但真的不是我给它的运行时间不够,反反复复试…

Django之旅:第五节--Mysql数据库操作(一)

Django开发操作数据库更简单,内部提供了ORM框架 一、安装第三方模块 pip install mysqlclient注:最新的django框架需要使用mysqlclient模块,之前pymysql模块与django框架有编码兼容问题。 二、ORM 1、ORM可以帮助我们做两件事:…

docker部署mongodb数据库

1、下载 MongoDB 镜像 使用Docker部署MongoDB 之前,我们需要从 Docker Hub 上下载 MongoDB 镜像。这里我们下载最新版本的 MongoDB 镜像,使用以下命令进行下载: docker pull mongo:latest 下载完成后,我们就拥有了最新版本的 Mon…

Enhanced PEC-YOLO:电力施工场景安全装备检测的轻量化算法解析

目录 一、核心概述 二、核心创新点 1. ​C2F_Faster_EMA模块 2. ​SPPF_CPCA多尺度模块 3. ​BiFPN颈部网络

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…

RTMP推流服务器nginx在linux上的编译部署

RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等&…

PyQt6实例_批量下载pdf工具_主线程停止线程池

目录 前置: 代码: 视频: 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点: 线程池:QThreadPool,QRunnable; 信号与…

Tomcat生产服务器性能优化

试想以下这个情景:你已经开发好了一个程序,这个程序的排版很不错,而且有着最前沿的功能和其他一些让你这程序增添不少色彩的元素。可惜的是,程序的性能不怎么地。你也十分清楚,若现在把这款产品退出市场,肯…

正则表达式-笔记

文章目录 一、正则表达式二、正则表达式的基本语法字符类普通字符非打印字符特殊字符 量词限定符锚点修饰符(标记) 三、在 Python 中使用正则表达式简单搜索提取信息替换文本 参考 从验证用户输入,到从大量文本中提取特定信息,再到…

Qwen-0.5b linux部署

参考链接 https://blog.csdn.net/imwaters/article/details/145489543 https://modelscope.cn/models/modelscope/ollama-linux 1. ollama安装 # 安装ModelScope工具包,用于下载和管理AI模型 pip install modelscope# 下载Ollama的Linux版本安装包 # --model 指定…