C++开发面试题

C++相关:

1、C中的struct与C++中的class有什么区别?(C++与C中的struct有何不同)

答:

①C中的struct不可以有函数成员,但是C++的class可以。   

②C中的struct数据成员没有private等权限的访问限制,而C++中的struct和class都有(C++中struct的默认权限是public,class的默认权限是private)     

③C中的struct没有继承关系,但C++的class有。

④C++中的class可以用于模板定义,struct不行。

2、C++11具有哪些新特性?

答:

1.auto、decltype类型推导:可以在编译期就将变量或者表达式的类型推导出,简化代码。

2.Lambda表达式(匿名函数):语法如下 

            [capture list]         (parameter list)        ->       return type            {function body}

 捕获列表(一般为&或者=)参数列表                        返回类型                   函数体

3.列表初始化:可以直接在变量名后面加上初始化列表来进行对象的初始化。

4.final:修饰虚函数表示虚函数不能再被继承。

5.override:检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错。

6.右值引用:格式(类型名 && 如:int &&)

7.智能指针(本质上是一个类,当超出作用域后会自动调用析构函数,自动释放资源):

std:shared_ptr:多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁:时释放。(引用+1,析构-1,引用个数为0时释放)

                          

std::weak_ptr:一种不控制对象生命周期的智能指针,指向一个shared_ptr管理的对象,提供对管理对象的一个访问手段。

                         

std::unique_ptr:实现独占式拥有或者严格拥有概念,保证同一时间只有一个智能指针可以指向该对象。

8.基于范围的for循环:for(int ch:char)...

9.default特性:用于声明构造函数为默认构造函数,因为当自定义有参构造函数时不会自动生成默认构造函数,所以需要通过default关键字(例如A a()=default;)来显式声明。

10.constexpr关键字:用于编译时的常量以及常量函数,可以使指定表达式在编译阶段就获得计算能力。

3、简述C、C++程序编译的内存分配情况。

三个区域进行分配:

静态存储区域:程序编译时就已经分配好,程序运行时一直存在。速度快,不容易出错,例如静态变量、全局变量、常量字符串等。(全局区、文字常量区、程序代码区)

栈:执行函数时,函数内局部变量都是在栈上创建的,函数执行完毕后由处理器自动释放,效率高,但是分配的内存容量有限。

 堆:动态内存分配。即程序运行时程序员自己利用malloc或者new申请的内存空间,并且用free和delete主动释放的内存空间。使用起来十分灵活,但容易造成内存泄漏。

4、简述一下C++的模板template。

答:模板是泛型编程的基础,实际上是建立一个通用函数或者类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。

5、虚函数与多态

答:

静态多态:函数重载(函数参数个数、类型不同),在编译期间确定。

动态多态:利用虚函数机制实现,在运行期间进行动态绑定。

虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段中,当子类继承父类时也会继承其虚函数表,当子类重写父类中虚函数时,会将继承到的虚函数表中的地址替换成重写的函数地址,最后利用指针去相应表中的地址调用函数。

6、实参与形参的区别:

①:主体不同,实参是调用有参函数时的括号中的实际参数,形参则是一种虚拟变量

②:目的不同,实参可以是常量、变量或者表达式,一定是有一种确定的值会传给形参,形参则是用来接收调用函数时传入的参数

③:特点不同:调用函数过程中,系统会将实参的值传递给被调用函数的形参,而形参相当于是一个别名,不占用内存空间。

7、C语言中的库和C++的库区别。

答:

C 标准库,也称为ISO C 库,是一系列的宏、类型和函数的集合,它们用于输入/输出处理、字符串处理、内存管理、数学计算和许多其他操作系统服务等任务。它在 C 标准(例如 C11 标准)中指定。内容分布在不同的头文件中,就像上面提到的math.h。

C++ 标准库是一组 C++ 模板类,它提供常见的编程数据结构和函数,例如列表、堆栈、数组、算法、迭代器和你能想到的任何其他 C++ 组件。C++ 标准库也包含 C 标准库,并且在 C++ 标准(例如 C++11 标准)中指定。

8、请简述C++语言的特性。

答:

封装:在面向对象的思想中,将数据和对数据的操作封装在一起——即类。

继承:继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码,在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。

多态:多态可以使我们以同一种变现形态实现不同的调用,我们可以使用一段代码处理不同类型的对象,只要他们继承/实现了相同的类型。这样我们没有必要为每一种类型的对象编写相同的逻辑,极大的提高了代码的重用。其实,用简单的一句话来形容就是:多态性,允许将子类类型的指针赋值给父类类型的指针,多态性在C++中是通过虚函数实现的。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”,或者称为“重写”。子类重写父类中虚函数时,即使不用virtual声明,该重载函数也是虚函数。

9、野指针(悬垂指针)是什么?

野指针:指向非法内存地址的指针叫做野指针,使用野指针有三种后果,一是程序会自发报错,无法进行编译,二是程序能运行,但是会存在隐患,三是野指针指向我们正在使用的内存空间,会导致程序崩溃或者数据丢失等。

悬垂指针:一个合法指针本来指向相应的对象,但是后来对象被释放,此时被称为悬垂指针。

10、简述STL库。

STL库:即标准模板库,Standard Template Library。

分类:vector、string、deque、list、set、map、multiset、multimap等

六大组件:容器、算法、迭代器、仿函数、适配器、分配器

11、this指针

当编译器在编译一个普通成员函数时,会隐式地增加一个非静态函数形参 this,并把当前对象的地址赋值给 this,所以普通成员函数能在创建对象后通过对象来调用并访问该对象的成员变量。

12、函数指针

定义:每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

定义形式 例如:int (*p)(int a,int b); //p是一个返回值为整型的函数指针。

为什么使用函数指针:使用函数指针可以将函数作为参数传递给其他函数,从而实现更加灵活的编程。函数指针可以用于回调函数、排序算法、动态库等场景中。此外,函数指针还可以用于实现多态性,即在不同的对象上调用同名的函数,实现不同的行为。

计算机网络:

1、TCP报文段结构是怎么样的?

答:包括16位源端口,16位目的端口,序号,确认号,数据偏移,保留字段,TCP标记(URG,ACK,PSH,RST,SYN,FIN),滑动窗口,校验和,紧急指针,选项。

2、简单介绍一下TCP/IP模型(4层模型)。(OSI  7层模型)

3、简述HTTP以及HTTPS的区别。

答:HTTP协议以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。HTTPS则是具有安全性的ssl加密传输协议。HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。并且HTTPS协议需要到CA申请证书。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。

4、请简述TCP三次握手和四次挥手过程。
5、简述域名解析顺序:

【1】浏览器缓存 【2】本机host文件 【3】路由缓存 【4】找DNS服务器(本地、顶级、根)

操作系统:

1、请写出Linux系统进程间通信(IPC)的几种方法:

①管道(无名管道,命名管道)

②消息队列

③信号量

④共享内存

⑤Socket

⑥Streams

数据结构:

1、简述队列和栈的异同:

答:队列和栈都是线性存储结构,但是两者的插入以及删除数据的操作不同,队列是先进先出,栈是先进后出。

2、递归

定义:程序调用自身的编程技巧称为递归。

优势:递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

算法:

1、自己写一个二叉树的代码,实现插入和删除功能。
2、对一个双向队列实现反转功能。(双指针)
3、编写一个函数判断输入的数字是否为2的幂函数。(提示:位运算 n&(n-1))
4、现有一个函数ran7()会给出1~7的随机数,请写出 ran10()给出1~10的随机数函数.

Linux指令:

1、列出文件:ls -la(以列表形式列出所有显示的文件、文件夹、隐藏文件)

2、打印当前工作目录:pwd

3、移动目录:cd

4、创建文件夹:mkdir -p(可一次性创建多层目录)

5、创建文件:touch

6、复制文件:copy -r 当前文件路径 复制处(r为递归复制,可以直接将文件夹内内容全部复制)

7、剪切:mv

8、打开文件编辑器:nano/vim

9、打开文件:cat/head/tail/less

10、查看磁盘空间:df -h(h为较高可读性)

11、查看内存使用情况:free -m(以mb形式进行查看)

12、统计文件内容信息:wc -(l为行数,w为单词数,c为字节数)

13、显示操作时间:date

14、显示日历:cal

15、清除终端中已存在信息:clear

16、显示操作服务器主机名:hostname -f(显示fullname)

17、查看一个用户基本信息:id

18、显示当前登录的用户名:whoami

19、查看服务器进程:ps -ef(e列出全部进程,f显示所有列)

20、查看服务器进程所占资源:top(q退出)

21、查看当前目录真实大小:du -sh(s汇总大小,h较高可读性)

22、查找文件:find 路径范围 -(name模糊搜索,type文件类型“-”“d”)

23、控制服务器启动停止重启: service start/stop/restart    (systemctl)

24、杀死进程:kill

25、操作网卡:ifconfig

26、重启计算机、关机:reboot/shutdown -h now

27、输出计算机在线时间:uptime

28、获取计算操作系统信息:uname -a

29、查看网络连接状态:netstat -tnlp(t指tcp,n将协议转为端口号,l过滤出listen状态连接,p为显示出连接的PID与进程的名称)

30、指令操作手册:man (相关命令)

MFC及Qt相关:

1、32位MFC是如何实现一个简单的窗口的?
2、Qt里的信号(signal)与槽(slot)的机制,并简单描述一下是窗口的形成过程。

答:通俗来讲,当我们需要信息传递进行通信,一个窗口部件会发送相应的信号(signal),另一个窗口接收到信号后会执行相应的操作,也就是我们的槽函数(slot),而一般信号会通过某个特定的动作来触发,这就需要用到connect操作来连接相应的信号以及槽,可以理解为信号会被相应的动作触发从而被槽接受在进行处理。

3、信号与槽的连接方式。

①一个信号与另一个信号连接

②一个信号与多个槽连接

③一个槽和多个信号连接

其他:

动态库以及静态库的区别:

静态库(.lib):在程序编译期间就链接至代码段中,程序运行时无需加载库,运行速度快,但是由于是整个库代码的复制,体积较大,浪费空间,更新时需要重新编译。

动态库(.dll .lib):动态库在编译时不会连接至目标代码,在程序运行时载入。不同的应用程序调用相同的库时,内存中只需要有一份共享库的实例即可。当升级产品功能时,只需要替换掉旧动态库,便于更新库文件。

JNI接口:

JNI是Java Native Interface的缩写,翻译过来是java本地开发接口,JNI是一种协议,它允许java和其他语言(主要是C和C++)进行交互,如java调用C和C++代码,同时C和C++代码也可以调用java的代码。

使用步骤:新建项目->编写本地接口函数->cmd窗口javah命令生成头文件->在jni下cpp文件中对函数进行编码->本地加载so库(生成在本地lib文件夹下)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值