面试问题记录一 --- C++(Qt方向)

        以下是我于2023年6~7月间换工作时遇到的面试题目,有需要的小伙伴可以参考下。约100个题目。

1       C和C++的区别

         1)      文件区别:C源文件后缀 .c;C++源文件后缀 .cpp

         2)      返回值: C默认返回int型;C++ 若无返回值,必须指定为void

         3)      参数列表:C默认接收多个参数;C++默认为void,不接收任何参数

         4)      缺省参数:C不支持给函数参数指定默认值;C++支持

         5)      C++支持函数重载,C不支持

         (而C++支持重载的依仗就在于C++的名字修饰与C不同,例如在C++中函数int fun(int ,int)经过名字修饰之后变为_fun_int_int ,而C是_fun,一般是这样的,所以C++才会支持不同的参数调用不同的函数;)

         6)      C指针;C++多了引用

         7)      C是面向过程的,C++是面向对象的。

         8)      结构:C中的struct和C++的类,C++的类是C所没有的,但是C中的struct是可以在C++中正常使用的,并且C++对struct进行了进一步的扩展,C语言结构只有成员变量没有成员方法,C++结构有自己的成员变量和成员函数。使struct在C++中可以和class一样当做类使用,struct的成员默认访问修饰符是public,而class默认的是private;

         9)      动态管理内存:C是使用malloc/free函数,C++除此之外还有new/delete关键字

         10)   C++全部变量的默认链接属性是外链接,而C是内连接;

         11)   C中用const修饰的变量不可以用在定义数组时的大小,但是C++用const修饰的变量可以(如果不进行&,解引用的操作的话,是存放

2   C++特性

         继承(保持已有类的特征而构造新类的过程就是继承)

         封装(将数据和操作数据的方法绑定在一起)

         多态(调用成员函数时,会根据函数调用对象的类型来执行不同的函数)

3       对虚函数是如何实现的多态?

派生类重写父类的虚函数,并且用父类指针或引用去指向派生类的对象。那么在程序运行时就可以实现动态绑定,即实现多态。

4       当以类的对象作为函数参数时,引用、指针和对象它们有什么区别?

作为函数参数时,使用对象指针会产生副本,会带来时间和空间的消耗;

使用对象引用不会产生副本,也不会带来时间和空间的消耗;

引用和指针的相同点:  1. 都是地址的概念;  指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。

  引用和指针的区别:  1. 指针是一个实体,而引用仅是个别名;  2. 引用使用时无需解引用(*),指针需要解引用;  3. 引用只能在定义时被初始化一次,之后不可变;指针可变;  4. 引用不能为空,指针可以为空

5.说一下虚继承

虚继承是为了解决多重继承而出现的。让某个类做出声明,承诺愿意共享它的基类. 其中,这个被共享的基类就称为虚基类(VirtualBase Class),本例中的 A 就是一个虚基类。在这种机制下,不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。

6.C++有几种继承方式,详细说一下

三种,共有,私有,保护.

不同的继承方式决定了基类成员在派生类中的访问权限

1) public:

基类中的public和protected成员在派生类中仍然保持原有属性;

基类中的private成员在派生类中不能使用。

2) protected

基类中的public和protected成员在派生类中为protected属性;

基类中的private成员在派生类中不能使用;

3) private

基类中的public和protectd成员在派生类中为private属性;

基类中的private成员在派生类中不能使用

7.C和C++类型转换了解不,详细说下

一隐式类型转换

二者都有,包括赋值语句转换、初始化时的转换、表达式中的转换、传参时的转换。

C中

C++中

二强制类型转换

C中,只有(int)这种形式的强制类型转换运算符

C++中,有4个专用的强制类型转换运算符:

dynamic_cast:用于转换类类型

const_cast:用于去除const变量的const属性

static_cast:用于基本类型以及类类型的上下转换

reinterpret_cast:用于执行底层的重新解释类型转换

8.线程有几种同步方式,你在工作中用到哪些?Qt提供了几种同步方式?

线程同步是指同一进程中的多个线程互相协调工作从而达到一致性。

C++线程同步的四种方法:

1)  互斥量

2)  信号量

3)  读写锁

4)  条件变量

9.Qt中,说一下创建线程方式

1)继承QThread

2) 使用moveToThread

3)使用QtConcurrent

4) 使用线程池

11.数组和指针各自有什么优缺点?

1、从空间分配来说:数组是静态分配,指针是动态分配。

2、从访问效率来说:数组是直接访问,指针是间接访问,数组效率要高一点。

3、从安全性来说:数组容易造成越界,而指针会出现野指针造成的内存泄漏。相比之下数组更为安全一点。

4、从函数形参来说:越界传指针用指针的指针,传两位及以上数组用的是数组指针。

5、从处理对象来说:指针偏向于计算机地址的处理,而数组偏向于值的处理。

6、从空间连续性来说:指针分配空间不一定是连续的,而数组对一个的空间一定是里连续的。

1、指针可以直接对硬件进行操作访问,

2、数组的静态分配是比较占内存的,动态分配更为灵活,解决了空间分配利用率的问题。

3、指针访问更为灵活,相较于数组,但是由于它过于灵活,往往不注意就会造成内存泄漏。

16.C和C++中struct

17 C++中的struct和class的区别

1)默认的访问控制属性不同:

struct是public 的,class 是 private 的。

2)继承关系中的默认防控属性不同:

struct是public 的,class 是 private 的。

    3)class这个关键字还可用于定义模板参数,strcut不行

18.析构函数可以成为虚函数吗?为什么要用virtual关键修饰析构函数?不修饰行吗?

C++中基类采用virtual虚析构函数是为了防止内存泄漏。

具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用virtual虚析构函数。

19.虚函数怎么实现的?

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

20.重写、重载、覆盖

重写:如派生类对基类中的虚函数进行重新定义,是在不同作用域的;

重载:在同一作用域内写一个函数名相同,但参数列表不同的函数叫做重载。

(重载的函数应该是形参的数量或形参的类型上有所不同,不允许两个函数除了返回类型外其他所有要素都相同)

重定义:也叫作隐藏,子类重新定义父类中具有的相同名称的非虚函数.

21.预编译时,如何避免重复展开头文件

1) #ifndef#endif

2)#pragma once方式

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

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

相关文章

zookeeper-3.6.4集群搭建

1、上传zookeeper安装包并解压 上传路径:/opt/software/ 解压路径:/opt/module/ 2、创建数据目录及日志目录 #数据目录:/data/zookeeper/data/ #3台机器创建存储目录: sudo mkdir -p /data/zookeeper/data#日志目录&#xff1a…

Docker Desktop 设置镜像环境变量

点击run 展开Optional settings container name :容器名称 Ports:根据你需要的端口进行输入,不输入则默认 后面这个 比如我这个 5432 Volumes:卷,也就是做持久化 需要docker 数据保存的地方 Environment variables…

Mysql中having语句与where语句的用法与区别

分析&回答 我们在写sql语句的时候,经常会使用where语句,很少会用到having,其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别。having子句在查询过程中慢于聚合语句(sum,min,max,avg,count)。而where子句在查询过程中则快于聚合语句(sum,min,max,avg…

解决C++ 遇笔试题输入[[1,2,3,...,],[5,6,...,],...,[3,1,2,...,]]问题

目录 0 引言1 思路2 测试结果3 完整代码4 总结 0 引言 现在面临找工作问题,做了几场笔试,遇到了一个比较棘手的题目就是题目输入形式如下: [ [3,1,1], [3,5,3], [3,2,1] ] 当时遇到这个问题还是比较慌的,主要是之前没有遇到这样的…

【STM32】锁存器

问题背景 在学习FSMC控制外部NOR存储器时,看到在NOR复用接口模式下,AD信号[15:0]是复用的。也就是说,若不使用锁存器:当NADV为低时,ADx(x0…15)上出现地址信号Ax,当NADV变高时,ADx上出现数据信号Dx。若使用…

9.3.3网络原理(网络层IP)

一.报文: 1.4位版本号:IPv4和IPv6(其它可能是实验室版本). 2.4位首部长度:和TCP一样,可变长,带选项,单位是4字节. 3.8位服务类型 4.16位总长度:IP报头 IP载荷 传输层是不知道载荷长度的,需要网络层来计算. IP报文 - IP报头 IP载荷 TCP报文 TCP载荷 IP载荷(TCP报文) …

Golang编写客户端SDK,并开源发布包到GitHub,供其他项目import使用

目录 编写客户端SDK,并开源发布包到GitHub1. 创建 GitHub 仓库2. 构建项目,编写代码Go 代码示例:项目目录结构展示: 3. 提交代码到 GitHub仓库4. 发布版本5. 现在其他人可以引用使用你的模块包了 编写客户端SDK,并开源…

Vue项目案例-头条新闻

目录 1.项目介绍 1.1项目功能 1.2数据接口 1.3设计思路 2.创建项目并安装依赖 2.1创建步骤 2.2工程目录结构 2.3配置文件代码 3.App主组件开发 3.1设计思路 3.2对应代码 4.共通组件开发 4.1设计思路 4.2对应代码 5.头条新闻组件开发 5.1设计思路 5.2对应代码 …

Xcode打包ipa文件,查看app包内文件

1、Xcode发布ipa文件前,在info中打开如下两个选项,即可在手机上查看app包名文件夹下的文件及数据。

postman9.12.汉化版(附有下载链接)

想用英文版本的可以直接点击下载最新版本 这里直接付上9.12.2版本的下载链接,如果大家要下载别的版本,可以直接修改链接里面的版本号即可 ,下面是汉化包下载 链接:https://pan.baidu.com/s/1izK3HfqlfXJdq6KIYeJ2zw?pwdpetk 提…

【数据结构】2015统考真题 6

题目描述 【2015统考真题】求下面的带权图的最小(代价)生成树时,可能是Kruskal算法第2次选中但不是Prim算法(从v4开始)第2次选中的边是(C) A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …

划分Vlan时需要注意的问题

网络部分2019年才开始学习的,在学习过程中配置了整个公司的网络,心里才有了一点把握,算是掌握了最基本的。 不会的就上网学,反正网络上什么知识都有,只要有需求就对照着学,很长时间没有学习网络了&#xff…

567. 字符串的排列

我写了首诗&#xff0c;把滑动窗口算法变成了默写题 | labuladong 的算法小抄 (gitee.io) windows放窗口里需要统计的元素 class Solution { public:bool checkInclusion(string s1, string s2) {int left 0;int right 0;int flag 0;map<char, int> need;for (int …

【计算机组成 课程笔记】5.1 处理器的设计步骤

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 5 - 1 - 501-处理器的设计步骤&#xff08;14-49--&#xff09;_哔哩哔哩_bilibili 处理器&#xff0c;或者说是CPU&#xff0c;是现代计算机中最为复杂的一个部件。不过先不要劝退&#xff0c;要设计一个简单但是…

如何检测勒索软件攻击

什么是勒索软件 勒索软件又称勒索病毒&#xff0c;是一种特殊的恶意软件&#xff0c;又被归类为“阻断访问式攻击”&#xff08;denial-of-access attack&#xff09;&#xff0c;与其他病毒最大的不同在于攻击方法以及中毒方式。 攻击方法&#xff1a;攻击它采用技术手段限制…

若依 MyBatis改为MyBatis-Plus

主要内容&#xff1a;升级成mybatis-plus&#xff0c;代码生成也是mybatis-plus版本 跟着我一步一步来&#xff0c;就可完成升级&#xff01; 检查&#xff1a;启动程序&#xff0c;先保证若依能启动 第一步&#xff1a;添加依赖 这里需要在两个地方添加&#xff0c;一个是最…

【C语言】——调试技巧

目录 ​编辑 ①前言 1.什么是Bug&#xff1f; 2.什么是调试&#xff1f; 2.1调试的基本步骤 2.2Release与Debug 3.常用快捷键 4.如何写出好的代码 4.1常见的coding技巧 &#x1f449;assert() &#x1f449;const() const修饰指针: ①前言 调试是每个程序员都…

算法题打卡day56-编辑距离 | 583. 两个字符串的删除操作、72. 编辑距离

583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 状态&#xff1a;查看思路后AC。 和查找子序列的操作类似&#xff0c;但是考虑的是删除操作。代码如下&#xff1a; class Solution { public:int minDistance(string word1, string word2) {int len1 wor…

机器学习前沿:改进自身缺陷,满足新战略

前机械师&#xff08; 来源) 一、说明 机器学习在人工智能历史上扮演重要角色&#xff0c;然而&#xff0c;存在问题也不少。为了适应新时代和新任务&#xff0c;不做出重大改进是不可能的&#xff0c;本篇就一些突出问题和改进做出讨论。以便读者掌握未来的思路和方向。 二、机…

SSM框架-spring

SSM框架参考 spring Spring源码 Spring6课程笔记