全网最全最新100道C++面试题:60-80

news2024/9/9 5:08:14

前述:本文初衷是为了总结本人在各大平台看到的C++面经,我会在本文持续更新我所遇到的一些C++面试问题,如有错误请一定指正我。新建立了一个收集问答的仓库,欢迎各位小伙伴来更新鸭interview_experience: 本仓库初衷是想为大家提供一个便利,全面,准确的面试题学习场地,大家都可以对仓库进行更新,谢谢大家。。

61.构造函数是否能声明为虚函数?为什么?什么情况下为错误?

构造函数不能为虚函数,虚函数的调用是通过虚函数表来查找的,而虚函数表由类的实例化对象的vptr指针指向,该指针存放在对象的内部空间之中,需要调用构造函数完成初始化,如果构造函数为虚函数,那么调用构造函数就需要去寻找vptr,但此时vptr还没有完成初始化,导致无法构造对象。

62.类中static函数是否能声明为虚函数?

不能,因为类中的static函数是所有类实例化对象所共有的,没有this指针,而虚函数依靠vptr和vtable来处理,vptr是一个指针,在类中的构造函数中生成,并且只能通过this指针访问,对于静态成员函数来说,他没有this指针,无法访问vptr,因此static函数无法声明为虚函数

63.哪些函数不能被声明为虚函数?

构造函数,内联函数(内联函数有实体,在编译时展开,没有this指针),静态成员函数,友元函数(C++不支持友元函数的继承),非类成员函数

64.如何保证类的对象只能被开辟在堆上?(将构造函数声明为私有、单例)

将构造函数设置为私有,这样只能使用new运算符来建立对象,但是我们必须准备一个destory函数来进行内存的释放,然后将析构函数设置为protected,提供一个public的static函数来完成构造,类似于单例模式

如果在栈上分配呢?则是重载new操作符,使得new操作符的功能为空,这样就使得外层程序无法在堆上分配对象,只可以在栈上分配

65.讲讲你理解的虚基类

虚基类是 C++ 中一种特殊的类,用于解决多继承所带来的“菱形继承”问题。如果一个派生类同时从两个基类派生,而这两个基类又共同继承自同一个虚基类,就会形成一个“菱形”继承结构,导致派生类中存在两份共同继承的虚基类的实例,从而引发一系列的问题。

为了解决这个问题,我们可以将虚基类作为共同基类,并在派生类中采用虚继承的方式。

虚继承会使得派生类中只存在一份共同继承的虚基类的实例,从而避免了多个实例之间的冲突。

虚基类是可以被实例化的。

66.C++哪些运算符不能被重载?

成员访问操作符,域解析操作符,条件运算符之类的不能重载。其中并不推荐对逗号运算符,逻辑或逻辑与之类运算符进行重载,容易造成歧义。

67.动态链接和静态链接的区别,动态链接的原理是什么?

区别:他们的最大区别就是在于链接的时机不同,静态链接是在形成可执行程序前,而动态链接的进行则是程序执行时。

静态库:就是将库中的代码包含到自己的程序之中,每个程序链接静态库后,都会包含一份独立的代码,当程序运行起来时,所有这些重复的代码都需要占用独立的存储空间,显然很浪费计算机资源。

动态库:不会将代码直接复制到自己程序中,只会留下调用接口,程序运行时再去将动态库加载到内存中,所有程序只会共享这一份动态库,因此动态库也被称为共享库。

动态链接原理:是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件

68.C++中怎么编译C语言代码?

使用extern“C”让C++代码按照C语言的方式去编译

69.未初始化的全局变量和初始化的全局变量放在哪里?

初始化的全局变量存放在数据段,数据段数据静态分配。

未初始化的全局变量存放在BSS(Block Started By Symbol)段,属于静态内存分配

70.说一下内联函数及其优缺点

内联函数是在编译期将函数体内嵌到程序之中,以此来节省函数调用的开销。

优点:是节省了函数调用的开销,让程序运行更加快速。

缺点:是如果函数体过长,频繁使用内联函数会导致代码编译膨胀问题。不能递归执行

71.C++11中的auto是怎么实现自动识别类型的?模板是怎样实现转化成不同类型的?

auto仅仅只是一个占位符,在编译期间它会被真正的类型替代,或者说C++中变量必须要有明确类型的,只是这个类型是由编译器自己推导出来的。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式具体类型函数的模具,所以模板其实就是将原本应该我们做重复的事情交给了编译器。

72.map和set的区别和底层实现是什么?map取值的 find,[],at方法的区别(at有越界检查功能)

都是红黑树,find查找需要判断返回的结果才知道有没有查询成功。[]不管有没有就是0,如果原先不存在该key,则插入,如果存在则覆盖插入,at方法则会进行越界检查,这会损失性能,如果存在则返回它的值,如果不存在则抛出异常。

73.详细说一说fcntl的作用

作用:用于控制打开的文件描述符的一些属性和行为。

有五个功能:

1.复制一个现有的描述符(cmd=F_DUPFD)

2.获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)

3.获取/设置文件状态标记(cmd=F_GETFL或F_SETFL)

4.获取设置异步IO所有权(cmd=F_GETOWN或F_SETFL)

5.获取设置记录锁(cmd=F_GETLK或F_SET)

74.C++的面向对象主要体现在那些方面?

体现在C++引入了面向对象的一些特征,例如加入了封装继承多态的特点。(然后介绍一下封装继承多态)

75.介绍一下extern C关键字,为什么会有这个关键字?

是用来实现在C++代码段中用C语言的方式来编译代码,是C++为了兼容C语言所加入的关键字

76.讲一讲迭代器失效及其解决方法

序列式容器迭代器失效:当当前元素的迭代器被删除后,后面所有元素的迭代器都会失效,他们都是一块连续存储的空间,所以当使用erase函数操作时,其后的每一个元素都会向前移动一个位置,此时可以使用erase函数操作可以返回下一个有效的迭代器。

Vector迭代器失效问题总结:1.当执行了erase方法时,指向删除节点的迭代器全部失效,指向删除节点之后的全部迭代器也失效。

2.当进行push_back方法时,end操作返回的迭代器肯定失效。

3.当插入一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器失效。

4.当插入一个元素后,如果空间未重新分配,指向插入位置之前的元素的迭代器依然有效,但指向插入元素之后元素的迭代器全部失效。

Deque迭代器失效总结:1.对于deque,插入到除首尾位置之外的任何位置都会导致迭代器、指针和引用都会失效,如果在首尾位置添加元素,迭代器会失效,但是指针和引用不会失效。

2.如果在首尾之外的任何位置删除元素,那么指向被删除元素外其他元素的迭代器都会失效。3.如果在其首部和尾部删除元素则只会使指向被删除元素的迭代器失效。

关联型容器迭代器失效:删除当前的迭代器,仅仅会使当前的迭代器失效,只要erase时,递增当前迭代器即可。

77.编译器是如何实现重载的?

在编译时,编译器如果遇到了函数,就会在符号表里面命名一个符号来存放函数的地址,如果函数的使用在定义之前编译,无法在符号表中找到对应函数地址,则先标记为“?”(暂时未知),在全部编译结束后的链接过程将“?”在符号表里找到并替代为相应的函数地址,如果函数的定义在使用之前编译,则可以直接在符号表里找到对应函数地址直接使用,而在C语言中的符号表是以函数名为符号来存储函数地址,函数名相同的重载函数的地址应该不同,于是符号表中存在两个同符号的函数地址,在查找使用时会存在歧义和冲突。而C++符号表中的符号不是以函数名命名的,称为函数名修饰规则,虽然函数名相同,但是函数参数等其他属性不同,取的符号也不同,所以不会产生查询歧义的问题,使得函数可以重载。

78.什么是函数调用约定?

函数调用约定就是对函数调用的一个约束和规定,描述了函数参数是怎么传递和由谁清除堆栈的。它决定了,函数参数传递的方式(是否采用寄存器传递参数,采用哪个寄存器传递参数,参数压栈的顺序等),函数调用结束后栈指针由谁恢复(被调用的函数恢复还是调用者恢复),函数修饰名的产生方法。

__stdcall:是standardcall的缩写,是C++的标准调用方式,规则如下:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。被调用函数自动清理堆栈,返回值在EAX。函数修饰名约定:VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上“@”和参数的字节数。

__cdecl:是C DECLaration的缩写(declaration,声明),表示C语言的默认函数调用方法,规定如下:所有参数从右往左依次入栈,所有参数由调用者清除,称为手动清栈。返回值在EAX中。函数修饰名约定:VC将函数编译后会在函数名前面加上下划线前缀,由于由调用者清理栈,所以允许可变参数函数存在。

__fastcall:是快速调用约定,通过寄存器来传送参数,规则如下:用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍然自右向左压栈传送。被调用函数在返回前清理传送参数的内存栈,返回值在EAX中。函数修饰名约定:VC将函数编译后会在函数名前面加上“@”前缀,在函数名后加上“@”和参数的字节数。

__thiscall:是唯一一个不能明确指明的函数修饰符,thiscall只能用于处理C++类成员函数的调用,同时thiscall也是C++成员函数缺省的调用约定,由于成员函数调用还有一个this指针,因此必须特殊处理,规定如下:采用栈传递参数,参数从右向左入栈,如果参数个数确定,this指针通过TCX传递给被调用者,如果参数个数不确定,this指针在所有参数压栈后被压入堆栈。对参数个数不确定的,调用者清理堆栈,否则由被调函数清理堆栈,__thiscal不是关键字,程序员不能使用l

__pascal:与__stdcall一样,在VC中已经被废弃

79.使用条件变量的时候需要注意什么?

当signal先于wait时,该信号会丢失,不会被后续的wait捕获

条件变量wait时,条件的判断和wait操作需要锁来保证原子性,要保证这一点,需要生产者在生产资源、cond signal时加和cond wait相同的锁,这样就会保证cond wait和cond signal先后顺序不会有问题,无论是谁先执行,都不会存在任何问题。

80.类内普通成员函数可以调用类内静态变量吗,类内静态成员函数可以访问类内普通变量吗?

类内普通成员函数可以调用类内静态变量,因为类内静态变量在编译时就已经完成了初始化和内存分配,类内普通函数调用类内静态变量说明类已经完成实例化,所以可以调用。静态函数可以直接访问静态变量,静态函数不能直接访问非静态变量,但是可以通过将类实例化对象后,静态函数去访问对象的非静态成员变量。

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

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

相关文章

基于IEC61499标准的在线工业编程平台open61499

基于IEC61499标准的在线工业编程平台open61499是一个专为工业自动化领域设计的编程环境,它遵循IEC 61499标准,为开发者提供了一种高效、灵活的方式来创建、配置和管理分布式控制系统(DCS)的应用程序。以下是对open61499的详细解析…

LeetCode热题 翻转二叉树、二叉树最大深度、二叉树中序遍历

目录 一、翻转二叉树 1.1 题目链接 1.2 题目描述 1.3 解题思路 二、二叉树最大深度 2.1 题目链接 2.2 题目描述 2.3 解题思路 三、二叉树中序遍历 3.1 题目链接 3.2 题目描述 3.3 解题思路 一、翻转二叉树 1.1 题目链接 翻转二叉树 1.2 题目描述 1.3 解题思路 根…

【多模态大模型】 BLIP in ICML 2022

一、引言 论文: BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 作者: Salesforce Research 代码: BLIP 特点: 该方法分别使用ViT和BERT进行图像和文本特征提取&am…

【changchain-community安装失败】‘EntryPoints‘ object has no attribute ‘get‘报错解决

在安装changchain-community时报错信息如下: WARNING: Keyring is skipped due to an exception: EntryPoints object has no attribute get ERROR: Could not find a version that satisfies the requirement changchain-community ERROR: No matching distributio…

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe): 命名管道(FIFO): 消息队列(MQ): 信号量(semaphore): 共享内存(shared memory): 信号(signal): 内存映射(mapped memory): 内存映射和共享内存的区…

华杉研发九学习日记20 LinkedHashMap TreeMap Arrays 函数式接口 方法引用

华杉研发九学习日记20 一&#xff0c;LinkedHashMap 与HashMap相比&#xff0c;key是有序的 Map<Integer,String> map new LinkedHashMap<Integer,String>(); map.put(1, "one"); map.put(2, "two"); map.put(3, "three"); map.…

GitHub Desktop commit文件到repository

1. Clone a repository到本地 2. 在本地仓库修改/添加需要提交的文件或者文档 3. 添加comments并commit 4. 提交完成&#xff0c;点击Push origin提交代码到Github远程仓库 上传成功后&#xff0c;刷新Github网站页面就会出现上传的项目

鸿蒙应用框架开发【自绘编辑框】 输入法框架

自绘编辑框 介绍 本示例通过输入法框架实现自会编辑框&#xff0c;可以绑定输入法应用&#xff0c;从输入法应用输入内容&#xff0c;显示和隐藏输入法。 效果预览 使用说明 1.点击编辑框可以绑定并拉起输入法&#xff0c;可以从输入法键盘输入内容到编辑框。 2.可以点击a…

SSM老人服务管理系统小程序-计算机毕业设计源码91022

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

跨网段 IP 地址通信故障分析

现如今计算机网络的规模和复杂性不断增加&#xff0c;跨网段通信成为网络运行中的常见需求。但如果设备处于不同网段且路由设置出现偏差时就会导致通信故障&#xff0c;严重影响网络的正常运行和数据传输。 1.跨网段通信的基本原理 跨网段通信依赖于路由器的路由功能。路由器根…

vue3.0 入门基础知识汇总【1】 全面 精简 推荐

这篇博文主要对一些刚入门vue框架的同学&#xff0c;以及对vue基本知识进行巩固的&#xff0c;最后就是精简一下基本知识&#xff0c;以方便自己查看&#xff0c;感谢参考&#xff0c;有问题评论区交流&#xff0c;谢谢。 目录 1.component组件的基本结构和使用 2.method方法…

全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规范大汇总

全网最适合入门的面向对象编程教程&#xff1a;28 类和对象的 Python 实现-Python 编程原则、哲学和规范大汇总 摘要&#xff1a; 本文主要介绍了在使用 Python 进行面向对象编程时&#xff0c;Python 异常处理的原则-“请求谅解&#xff0c;而非许可”&#xff0c;以及软件设…

什么是安全编程?

安全编程&#xff08;Secure Programming&#xff09;是一种编程方法论&#xff0c;旨在通过编写安全可靠的代码来保护计算机系统和数据的安全性。它涵盖了软件设计、开发、测试和维护的整个生命周期&#xff0c;旨在最大程度地降低软件漏洞和安全缺陷的风险。以下是对安全编程…

【前端 20】Element-UI快速入门

探索Element UI组件库&#xff1a;快速搭建Vue应用的必备工具 在现代Web开发中&#xff0c;Vue.js以其轻量级和灵活性赢得了广泛的关注。而Element UI&#xff0c;作为Vue.js的一个UI组件库&#xff0c;更是为开发者们提供了丰富、易用的前端组件&#xff0c;极大地加速了开发过…

Spring源码(八)--Spring实例化的策略

Spring实例化的策略有几种 &#xff0c;可以看一下 InstantiationStrategy 相关的类。 UML 结构图 InstantiationStrategy的实现类有 SimpleInstantiationStrategy。 CglibSubclassingInstantiationStrategy 又继承了SimpleInstantiationStrategy。 InstantiationStrategy I…

Java----反射

什么是反射&#xff1f; 反射就是允许对成员变量、成员方法和构造方法的信息进行编程访问。换句话来讲&#xff0c;就是通过反射&#xff0c;我们可以在不需要创建其对象的情况下就可以获取其定义的各种属性值以及方法。常见的应用就是IDEA中的提示功能&#xff0c;当我…

摆弄it:越走越深

在英语中&#xff0c;it是一个单词&#xff0c;就是“它”&#xff0c;这是众所周知的事情。今天&#xff0c;我们就来摆弄一下it&#xff0c;摆弄一下“它”&#xff0c;看看能摆弄出什么名堂来。 一、它是它自己 it 大家都知道&#xff0c;同样&#xff0c;itself&#xff0…

大模型算法面试题(十七)

本系列收纳各种大模型面试题及答案。 1、LoRA权重是否可以合入原模型 LoRA权重可以合入原模型。LoRA&#xff08;Low-Rank Adaptation of Large Language Models&#xff09;是一种用于微调大型语言模型的低秩适应技术。它通过训练低秩矩阵&#xff0c;并将这些参数注入到原始…

onlyoffice用nginx反向代理

我对于onlyoffice的需求就是当个在线编辑器使用。在集成react的时候之前都是写的绝对路径的地址&#xff0c;这样在需要迁移应用的时候就造成了巨大的麻烦&#xff0c;所以我决定用nginx做反向代理&#xff0c;这样我集成的时候就不用每次都修改源码中的地址了。 一开始写的代…

LINUX进程间的通信(IPC)--信号

一、概念 信号通信&#xff0c;其实就是内核向用户空间进程发送信号&#xff0c;只有内核才能发信号&#xff0c;用户空间进程不能发送信号。信号已经是存在内核中的了&#xff0c;不需要用户自己创建。 信号通信的框架 * 信号的发送&#xff08;发送信号进程&#xff09;&am…