C++面试题总结-自用+分享-后续更新

#初版2024.3.12
##面试内容:
1、C++11(支持智能指针)C++14、C++17
2、算法与数据结构
3、QT开发
4、python脚本编写
5、SVN或git
6、计算机图形学OpenCV、OPenGL、VTK、OSG
7、分布式软件架构设计、灾备设计、高性能设计、弹性可扩展设计
8、数据库SQL
9、linux平台高并发、多线程、GDB调试、profiling
10、协议:TCP(传输层)/HTTP/HTTPS(应用层)
11、MFC界面 GDI编程
##基础知识篇
1、
注意:应特别注意在 int、指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“==” 误写成“=”时,编译器可以报错,否则这种逻辑错误不容易发现,并且可能导致很严重的后果。

#include<complex>
//float 型数据与零比较: 
if ( ( flag >= -NORM ) && ( flag <= NORM ) ) 
{
   
    
 	A; 
} 
//int 型数据与零比较:
int flag;
if(0==flag)
{
   
   
	A;
}
//指针型
int * flag;
if(NULL==flag)
{
   
   
	A;
}
//bool 型数据与零比较:
if(flag)
{
   
   
	A;
}

2、sizeof和strlen的区别
sizeof:操作符;在编译的时候就计算出结果;参数可以是数据类型和变量;参数为数组时候不退化
strlen :库函数;在运行时候才能计算出结果;参数以\0作为结尾;参数为数组时候退化为指针
实现拷贝功能的三种方法:
strcpy ,memcpy ,sprintf

3、malloc和new的区别
new:new 和delete是操作符,在C中可用;调用构造函数和析构函数;返回某种类型的指针
malloc:malloc和free是函数,可以覆盖,C\C++中都可用;仅分配内存和回收内存;返回void类型指针

3、23种设计模式,六大原则(详细下篇具体记笔记)
降低耦合度,减少依赖
开放封闭原则:扩展开放,修改关闭
里氏替换原则:派生类可以替换掉基类,且软件功能不受影响
依赖倒置原则:依赖于抽象而不依赖于具体
接口隔离原则:使用多个接口比使用单个接口要好,降低类之间的耦合度
迪米特法则,最少知道原则:一个实体应该尽少地与实体之间发生作用,使得系统功能模块相对独立
合成复用原则:尽量使用合成/聚合的方式,而不使用继承

创建型模式、结构型模式、行为型模式、J2EE模式
工厂模式(创建型模式)当你需要什么,只需要传入一个正确的参数,就可以获得你所需要的对象,而无需知道其创建细节

4、智能指针
为什么引入智能指针?
防止程序员new之后忘记delete,造成内存泄漏;或者在另外一个指针还在使用同一块内存时,一个指针提前释放此内存,造成引用非法内存的指针。
为了更安全地使用指针,引入了智能指针。
智能指针负责自动释放指定的对象
shared_ptr :允许多个指针指向同一个对象
unique_ptr :独占 不能进行复制,只能进行移动操作
weak_ptr:弱引用,指向shared_ptr所管理的对象 不会对所指堆内存的引用计数+1
头文件:
智能指针代码示例:

5、静态库与动态库
本质区别:是否被编译到程序内部
静态库:劣势:文件大、函数库更新需要重新编译 优势:但是编译成的可执行文件可以独立运行
动态库:在程序中只有一个指向的位置,执行程序需要用到函数库机制时,程序才会读取程序库来调用。
劣势:可执行文件无法单独运行 优势:产品升级方便,直接升级对应动态库即可,不必重新编译整个可执行文件

从产品化的角度,发布的算法库或功能库尽量使动态库,这样方便更新和升级,不必重新编译整个可执行文件,只需新版本动态库替换掉旧动态库即可。
从函数库集成的角度,若要将发布的所有子库(不止一个)集成为一个动态库向外提供接口,那么就需要将所有子库编译为静态库,这样所有子库就可以全部编译进目标动态库中,由最终的一个集成库向外提供功能。

6.Boost库
boost库详解
自己动手编译一个boost库
<1>准备boost源码,目前我用到的源码版本为1.58.0 (源码链接,可参考官网或以下链接 https://sourceforge.net/projects/boost/files/boost/)
<2>解压源码:gzip -d boost_1_58_0.tar.gz
<3>解压源码 :tar -xvf boost_1_58_0.tar
<4>文件夹赋予777权限:chmod -R 777 * 【注:必须要赋予可执行权限,否则会编译失败。】
<5>生成b2, bjam文件:./bootstrap.sh --prefix=/home/admin/boost --with-libraries=all --with-toolset=gcc
–prefix-> 安装路径
–with-libraries -> 编译库
–with-toolset -> 编译工具
<6>、编译,安装:./b2 install
7.cmake
cmake学习指南
8.内存分配的方式:静态存储区、栈区、堆区
静态存储区:例如全局变量、static变量,在程序编译时就已经分配,整个运行期间都会存在;运行速度快,不易出错,系统自动管理回收
栈区:函数内部局部变量,函数执行结束时存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限
堆区:动态内存分配。程序在运行时候用malloc或new申请任意大小的内存,程序员任何时候决定free或者delete。如果不回收则会出现内存泄露的问题,且频繁分配和回收内存不同大小的堆空间容易出现堆内存碎片

9、数组作为参数传递时,退化为一个指针
10、C语言的移位问题
算数右移与逻辑右移
逻辑右移就是不考虑符号位,右移一位,左边补零即可。
算术右移需要考虑符号位,右移一位,若符号位为1,就在左边补1,;否则,就补0。
所以算术右移也可以进行有符号位的除法,右移,n位就等于除2的n次方。
例如,8位二进制数11001101分别右移一位。
逻辑右移就是[0]1100110
算术右移就是[1]1100110
<注意> 不同的编译器,有些是逻辑右移,有些是算数右移。为了保证统一性,定义为unsigned+类型,(采用无符号的数)保证移位运算结果的统一性
<注意>做移位运算的时候要注意:当移位超过类型能表示的最大位数时候,会清零,因此要格外小心。移位数要大于0,小于位数(比如一个char类型的位数是8位,与char类型做与运算或者或运算的时候最多移位小于8)
移位运算:const unsigned char BACK=(1<<6)//表示1向左移动六位0010 0000
为了保证超过最大位数不清零,我们可以使用bitset,输出为二进制,很直观,对初学者十分友好
11、C语言类型转换上的问题
sizeof返回值是一个unsigned类型。在C/C++中尽量避免unsigned值做比较,容易出现补码错误的问题;
整型值/整型值=一个整型值,即使将结果赋值给double,依然是一个整型.0,要想计算出正确的浮点型的值,需要拿至少一个浮点型的值.0做运算。
C++中四种类型转换:static_cast、const_cast、dynamic_cast、reinterpret_cast
static_cast:静态变量类型的强制转换
const_cast:常量转换为非常量的强制转换
dynamic_cast:类中父类和子类之间的强制转换
reinterpret_cast:指针内部任意类型的强制转换

12、C语言整数溢出问题
C语言中的整数不等于数学上的整数
C语言整数溢出可以引入boost库来解决

13、string
使用strcat的时候一定要小心:strcat(s1,s2),s1的长度要能容纳连接字符的总长度
用strcat_s替代strcat,更安全的方法
C语言字符串的典型缺陷:使用strlen(),计算的是字符串的长度(计算到\0之前);使用sizeof,计算的是数组容纳的空间(包括\0)
string.length() string字符串内部内容的实际长度 string.size()和string.length()是同义词,并返回完全相同的值。
string.capacity():返回已分配存储的大小。此容量不一定等于字符串长度。 它可以相等或更大
使用redis

13、C语言typedef和define的区别详解
typedef 是用来定义一种类型的新别名的,它不同于宏(#define),不是简单的字符串替换
#define 只是简单的字符串替换(原地扩展)在预处理时完成

二分查找法的时间复杂度为O(log2n),也叫折半查找法

14、指针
间接访问其它变量地址

15、cmake,CMakeLists.txt,Makefile的区别
手写 CMakeLists.txt 文件,CMake 根据 CMakeLists.txt 文件,生成 Makefile 文件,然后编译工程
[makefile学习总结]
(1)CFLAGS 是一个常用的 Makefile 变量,用于指定 C 语言编译器的参数。

# 设置编译器参数
CFLAGS = -Wall -O2
- `-Wall` 表示开启所有警告信息,这样可以让编译器输出更多有用的警告信息,帮助你发现潜在的问题。

- `-O2` 表示开启优化级别 2,这会让编译器进行更多的优化,生成性能更好的代码。
引入头文件:
# 定义头文件的搜索路径
CFLAGS = -I/path/to/include

-I选项来指定头文件的搜索路径:

```makefile
# 定义头文件的搜索路径
CFLAGS 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值