C++—八股文总结(25秋招期间一直更新)

1、const

1.1 指针常量和常量指针

说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点。
const int *a==int const *a;  //可以通过 a 访问整数值,但不能通过 a 修改该整数的值,指针本身是可变的,可以指向不同的整数
const int a;  //a变量变成常量,不可修改
int *const a;  //a的值可以更改,但是指向它的指针不能更改
int const *const a;  //a本身和指向它的指针都不能更改

1.2 const成员函数

常函数内不能修改成员变量
对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

1.3 const和#define的区别

1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。
而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。
(2)有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
(3)#define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。
(4)#define定义的常量不分配内存,而const定义的常量会分配在常量存储区中。

具体可看以下博客7.5小节

C++入门基础(二)_c语言最小体重-CSDN博客文章浏览阅读387次。初学C++,每周更新自己所学!_c语言最小体重https://blog.csdn.net/qq_56896418/article/details/127675418?spm=1001.2014.3001.5502

2、 虚函数

2.1 作用

父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

2.2 实现

每个虚函数都会有一个与之对应的虚函数表,该虚函数表的实质是一个指针数组,存放的是每一个对象的虚函数入口地址。对于一个子类来说,他会继承父类的虚函数表同时增加自己的虚函数入口地址,如果子类重写了基类的虚函数的话,那么继承过来的虚函数入口地址将被子类的重写虚函数入口地址替代。那么在程序运行时会发生动态绑定,将父类指针绑定到实例化的对象实现多态。每个类只有一个虚函数表,虚函数表是在编译的时候就确定的了。

2.3 纯虚函数

用户不能创建基类的实例,只能创建派生类的实例

2.4 虚函数调用时机

虚函数在运行时根据实际对象的类型来确定调用哪个函数,而不是根据指针或引用的类型来确定。当一个虚函数被定义为类的成员函数时,它会被标记为虚函数。在调用虚函数时,程序会查找该函数的实际类型,并在运行时调用该类型的实现。这就允许程序在运行时动态地选择执行哪个版本的虚函数,从而实现多态性。虚函数通常与父类指针或引用一起使用,可以实现父类指针或引用调用子类的函数。

2.5 大小

虚函数表是一个存储虚函数指针的数组,每个类有一个虚函数表,每个对象有一个指向虚函数表的指针。虚函数表的大小取决于类中有多少个虚函数,而对象中的虚函数表指针的大小取决于编译器和操作系统。一般来说,在32位系统下,指针占4个字节,在64位系统下,指针占8个字节。

2.6 C++哪些函数不能定义为虚函数

构造函数:构造函数不能被声明为虚函数。因为构造函数是用来创建对象的,而虚函数是根据对象的类型来动态调用的。如果构造函数是虚函数,那么在创建对象时就无法确定调用哪个版本的构造函数,会导致逻辑错误
友元函数:友元函数实际上并不属于类的成员函数,所以不能被定义为虚函数
普通函数:普通函数只能被重载,不能被重写。

2.7 为什么虚函数不能是模版函数

因为模板函数在编译时会被实例化为多个不同的函数,而虚函数需要在运行时才能确定调用哪个函数。在C++中,虚函数的实现依赖于虚函数表(vtable)和虚函数指针(vptr),而这些在编译时就需要确定下来。因此,虚函数不能是模板函数。

2.8 虚函数表既然希望类的所有对象共享为什么不放在全局区

虚函数表不能放在全局区,因为全局区是存放全局变量和静态变量的,而虚函数表不是变量,而是一组指向类成员函数的指针。如果放在全局区,会导致内存浪费和混乱。
混乱:虚函数表是在编译期就确定了大小和内容的,而全局区是在运行期才分配空间的。如果把虚函数表放在全局区,就需要在运行期动态地为每个类分配空间,并且要保证不同类之间不会发生冲突。这样就增加了程序的复杂度和出错的可能性。

C++核心编程-4、类和对象4—多态-CSDN博客文章浏览阅读287次。【代码】C++核心编程-4、类和对象4—多态。https://blog.csdn.net/qq_56896418/article/details/140632373?spm=1001.2014.3001.5502

3、菱形继承

菱形继承(Diamond Inheritance)是一种多重继承的情况,其中一个子类同时继承自两个直接或间接共同父类,而这两个父类又继承自同一个共同的父类。这样就形成了一种菱形的继承结构,因此称为"菱形继承"。
解决方法:虚继承,出现二义性通过添加作用域解决,而继承爷爷类的数据有两份,通过虚继承解决。

具体看博主下面这篇博客的菱形继承部分。
C++核心编程-4、类和对象3—继承-CSDN博客文章浏览阅读237次,点赞9次,收藏3次。在Son3中已经变为了私有,即使孙子类公共继承,依然不不能访问,仍是私有权限。然后我们采用VS自带的工具进行验证:Vs的开发人员命令提示符。https://blog.csdn.net/qq_56896418/article/details/140590494?spm=1001.2014.3001.5502

4、类型转换

4.1 static_cast

static_cast 用于执行非多态类型之间的类型转换,例如整型和浮点型之间的转换、基类和派生类之间的指针或引用转换、void 指针和其他指针类型之间的转换等。该转换在编译时完成,通常不会检查运行时错误。

4.2 dynamic_cast

dynamic_cast 用于在运行时进行多态类型的转换。它通常用于将基类指针或引用转换为派生类指针或引用,以及在类层次结构中进行下行转换

4.3 dynamic_cast与虚函数的区别

功能:虚函数: 实现运行时多态性,使得可以在基类指针或引用中调用派生类的方法。
dynamic_cast: 用于类型安全的向下转型或交叉转型,确保转换成功与否。
实现方式:虚函数: 通过虚表(vtable)机制实现动态绑定。
dynamic_cast: 依赖于运行时类型识别(RTTI)来安全地转换类型。
使用场景:虚函数: 用于实现和利用多态性。
dynamic_cast: 用于在复杂的类层次结构中进行安全的类型转换。

4.4 reinterpret_cast

reinterpret_cast 用于在不同的指针类型之间进行转换,**例如将一个指针转换为一个整数,或将一个整数转换为一个指针。**该转换通常不进行类型检查,因此潜在地不安全,只应在极少数特殊情况下使用。

4.5 const_cast

const_cast 用于在去除变量的 const 修饰符或 volatile 修饰符时使用。它可以将指向常量对象的指针或引用转换为指向非常量对象的指针或引用,或者将指向非常量对象的指针或引用转换为指向常量对象的指针或引用。

4.6 volatile关键字

在 C++ 中,关键字 volatile 用于声明一个变量是易变的(volatile variable),即该变量可能会在程序中的任意时刻被意外地改变。这意味着,当读取一个易变的变量时,编译器不会从缓存中读取该变量的值,而是每次都会从内存中重新读取该变量的值。同样地,当写入一个易变的变量时,编译器也不会将该变量的值存储在缓存中,而是立即将该变量的值写入内存中。

5、构造函数

具体可看博主这篇博客的4.2小节。有代码和更详细的分析。

C++核心编程-4、类和对象1-CSDN博客文章浏览阅读375次,点赞12次,收藏3次。分析:类中包含属性和行为,属性为变量r,行为为函数calculate。而对象是通过类创建的实例化对象,具体化出一个对象。https://blog.csdn.net/qq_56896418/article/details/140463895?spm=1001.2014.3001.5502

5.1 拷贝构造函数

什么时候调用拷贝构造函数(上述博客中的4.2.3中的三种)

答:用已经初始化的对象给另一个初始化的对象赋值。
函数用对象作为返回值。
函数用对象作为参数。

5.2 析构函数

析构函数为什么要声明为虚的?

A* p = new B;
delete p;(A是父类 B是子类)
如果不定义虚析构 那么删除P只调用A的析构,而不会调用子类的析构函数。
定义为虚析构之后,删除P就会调用AB的析构

5.3 移动构造函数

在C++中,当一个对象被复制时,其内部资源通常会被复制,这可能会导致性能问题,特别是在处理大型数据结构时。移动构造函数是当你将一个大对象赋值给另一个对象时,移动构造函数会将资源所有权转移,而不是复制数据。

6、引用

注意事项(引用即起一个别名)

引用必须初始化
引用在初始化后,不可以改变

6.1 C++类内是否可以定义引用? 

可以,但是必须使用成员初始化列表为引用变量初始化,构造函数的形参也必须是引用类型

在 C++ 中,类内可以定义引用,但有一些特殊的规则和注意事项。

总结
引用成员必须在初始化列表中初始化,不能在类体中单独赋值。
引用必须绑定到有效对象,在引用的整个生命周期内该对象必须存在。
常量引用 也可以在类中使用,并且一旦绑定后无法修改。

7、模版类

C++提高编程—1、模板-CSDN博客文章浏览阅读273次,点赞4次,收藏3次。示例:两种调用模版的方式。https://blog.csdn.net/qq_56896418/article/details/140750118?spm=1001.2014.3001.5502

7.1 模板类是什么时候实现的?

模板类的实现不是在程序运行时期间动态生成的,而是在编译阶段根据需要进行实例化和生成对应的代码。这也是为什么在使用模板类时,模板类的声明和定义通常需要放在头文件中,以便编译器在需要的地方进行实例化,并生成相应的代码。

7.2 模板的实例化

在 C++ 中,模板的实例化是指创建特定类型或特定参数的模板实例的过程。这使得模板能够处理具体的数据类型或值,并生成适用于这些类型或值的具体代码。实例化是模板的一个重要概念,它确保模板代码被转换为实际可执行的代码。

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

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

相关文章

Rustrover、IDEA 的 Rust 类型不显示(已解决)

关键词:rustrover 类型不显示,rustrover 不显示类型,IntelliJ IDEA Rust 类型不显示,IntelliJ IDEA Rust 不显示类型 若移动端访问不佳,请使用 –> Github版 背景 博主手欠,使用 IntelliJ IDEA 时&am…

mysql中出现错误1138-Invalid use of NULL value

问题:1138-Invalid use of NULL value 解决: 问题是当前字段中,有null的值,简单来说就是,你表里有空值,不能设置不为空!!! 把空的值删掉重新设计就好了

LaTex插入图片

LaTeX 提供了许多定制化图片的功能。这篇文章将会介绍如何用最常见的格式插入图片、缩放图片以及如何在文档中引用这些图片。 1.基本使用 效果图如图所示。 \documentclass{article} \usepackage{graphicx} \graphicspath{ {./figure/} }\begin{document}\begin{figure}[!t]…

JUC-Synchronized原理进阶

轻量级锁 轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是 synchronized 假设有两个方法同…

electron-vite封装UI级的消息提示

说明 Electron Vite Vue3 Element Plus Electron中写提示有两种方案: 系统级:electron带的dialog相关APIUI级:UI框架内部的提示,如ElMessage、ElMessageBox、ElNotification等 今天来封装一下UI级别的提示 代码 效果图 源…

巡检机器人的使用方法和维护保养

在当今快速发展的工业环境中,智能巡检机器人正逐渐成为提升运维效率和安全性的重要工具。旗晟机器人凭借其核心技术团队和多年的行业经验,推出了多款高效、智能的巡检机器人,旨在帮助企业实现设备运维的智能化升级。本文将介绍旗晟巡检机器人…

存储与传输/大小端字节序的概念、决定因素、给编程带来的困扰

文章目录 概述大小端分歧的类比为什么要关注字节序NET网络字节序什么时候必须转换字节序大小端字节序哪个优秀判断系统字节序类型字节序类型转换大小端内存监视和调试 谁决定了大小端模式CPU架构决定大小端操作系统影响大小端?编译器也影响大小端?可配置…

【威锋网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

深度解析:常见本地大模型知识库工具部署、微调与对比,个人高效选型指南!

常见本地大模型知识库工具 LLM knowledge base 这里先盘点一下最近比较火爆的几个工具,将从知识库侧和大模型侧分别介绍。 01 知识库侧 知识库侧主要是指更加偏向于能够直接读取文档并处理大量信息资源,包括文档上传、自动抓取在线文档,…

Linux下进程间的通信--信号

信号的概念: 在Linux操作系统中,信号是一种软件中断机制,用于通知进程某个事件已经发生。信号是Linux进程间通信(IPC)的一种简单且快速的方式,它可以用来处理各种异步事件,如用户输入、硬件事件…

Redis (day 3)

一、通过jedis连接数据库 1.首先导入依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.1.0</version></de…

(第三十三天)

1. 设置主从从 mysql57 服务器 &#xff08; 1 &#xff09;配置主数据库 [rootmsater_5 ~] # systemctl stop filewalld [rootmsater_5 ~] # setenforce 0 [rootmsater_5 ~] # systemctl disable filewalld [rootmsater_5 ~] # ls anaconda-ks.cfg mysql-5.7.44-linux-g…

【Unity】通用GM QA工具 运行时数值修改 命令行 测试工具

GM工具使用: GM工具通常用于游戏运行时修改数值(加钱/血量)、解锁关卡等&#xff0c;用于快速无死角测试游戏。一个通用型GM工具对于游戏项目是非常实用且必要的&#xff0c;但通用不能向易用妥协&#xff0c;纯命令行GM门槛太高&#xff0c;对QA不友好。 这类运行时命令行工具…

进程的创建、终止

目录 前言1. 进程创建2. 进程终止3. exit && _exit 的异同3.1 相同点3.2 不同点 前言 紧接着进程地址空间之后&#xff0c;我们这篇文章开始谈论进程控制相关的内容&#xff0c;其中包括进程是如何创建的&#xff0c;进程终止的几种情况&#xff0c;以及进程异常终止的…

数学建模学习(115):主成分分析(PCA)与Python实践

文章目录 一.主成分分析简介1.1 数学背景与维度诅咒1.2 PCA的定义与应用二.协方差矩阵——特征值和特征向量三.如何为数据集选择主成分数量四.特征提取方法五.LDA——与PCA的区别六.PCA的应用七.PCA在异常检测中的应用八.总结一.主成分分析简介 1.1 数学背景与维度诅咒 主成成…

TOP10漏洞原理

## 本人为学习网安不久的新人&#xff0c;记一次学习笔记&#xff0c;有缺陷或者表述不对的地方欢迎大家指出&#xff0c;感谢&#xff01; ## 1、sql注入&#xff1a;web应用程序对用户输入的数据没有进行过滤&#xff0c;或者过滤不严&#xff0c;就把sql语句拼接进数据库…

Mac电脑遇到DNS解析失败,ip可以访问,域名无法访问

当Mac电脑遇到DNS解析失败的问题时&#xff0c;可以尝试以下几个解决方法‌&#xff1a; 1.检查网络连接‌&#xff1a;确保Mac已连接到可用的网络&#xff0c;并且网络连接正常。可以尝试重新连接Wi-Fi或使用有线连接来排除网络问题。 2.清除DNS缓存‌&#xff1a;打开终端应…

docker容器基本命令、docker进入容器的指令、容器的备份、镜像底层原理、使用commit命令制造镜像、将镜像推送到阿里云镜像仓库与私服仓库

除了exit 还有 ctrlpq exit退出停止 ctrlpq 退出不停止 将本地镜像推到阿里云 登入阿里云 容器镜像服务 实力列表 镜像仓库 创建镜像仓库 安装里面步骤来 这里192.168.10.145这部分用自己ifconfig地址

【Android 远程数据库操作】

按正常情况下&#xff0c;前端不应该直接进行远程数据库操作&#xff0c;这不是一个明智的方式&#xff0c;应该是后端提供对应接口来处理&#xff0c;奈何公司各方面原因需要前端这样做。 对此&#xff0c;我对远程数据库操作做了总结&#xff0c;便于自己复盘&#xff0c;同…

python绘制爱心代码

效果展示 完整代码 Python中绘制爱心的代码可以通过多种方式实现&#xff0c;高级的爱心代码通常指的是使用较复杂的算法或者图形库来生成更加精致的爱心图形。下面是一个使用Python的Turtle模块来绘制爱心的示例代码&#xff1a; import turtledef draw_love():turtle.speed…