#初版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 
                
                  
                  
                  
                  
最低0.47元/天 解锁文章
                          
                      
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					267
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            