整理的C++面试题,大厂面试总遇到!

312 阅读3分钟

C++语言基础、语言特性、数据结构、操作系统知识甚至是一些内核相关的知识、网络相关知识、数据库操作、多线程多进程数据同步互斥、内存相关知识等等。

1.C中的malloc 和C++中的new 有什么区别

malloc 和new 有以下不同: (1)new 、delete 是操作符,可以重载,只能在C++ 中使用。

(2 )malloc、free 是函数,可以覆盖,C、C++ 中都可以使用。

(3 )new 可以调用对象的构造函数,对应的delete 调用相应的析构函数。 (4 )malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数

(5)new 、delete 返回的是某种数据类型指针,malloc、free 返回的是void 指针。 注意:malloc 申请的内存空间要用free 释放,而new 申请的内存空间要用delete 释放,不要混用。

因为两者实现的机理不同。

2..程序什么时候应该使用线程,什么时候单线程效率高。

1 耗时的操作使用线程,提高应用程序响应

2 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。

3 多CPU系统中,使用线程提高CPU利用率

4 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。 其他情况都使用单线程。

3.类相关的题目 为什么要进行封装? 什么是多态,多态是怎么实现的?多态的应用场景? 虚函数表是属于类的还是属于成员的?虚指针呢? 虚函数,纯虚函数?什么时候使用虚函数,什么时候使用纯虚函数?有了虚函数为什么还要用纯虚函数,可以用虚函数替代纯虚函数吗? 类的构造函数可以定义为虚函数吗?析构函数呢? 基类的析构函数为什么通常需要定义为虚函数?如果不定义为虚函数会有什么问题?什么场景下会产生这种问题? 定义拷贝构造函数的时候参数有什么要求?为什么要将参数定义为引用,如果不定义为引用会产生什么问题? 什么是深拷贝?怎么实现深拷贝? 构造函数的成员初始化列表的使用场景?什么时候必须使用初始化列表?

4.说一说C与C++的内存分配方式?

  1从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量,static变量。

  2在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  3从堆上分配(动态内存分配)程序在运行的时候用malloc或new申请任意多少的内存,程序员负责在何时用free或delete释放内存。动态内存的生存期自己决定,使用非常灵活。