分为:测试理论、C 语言、C++、STL 容器、项目相关,全部简答,面试口述版
二、C 语言
- C 语言数据类型? 基本:整型int,short,long,longlong、浮点、char、_Bool;构造:数组[ ]、结构体struct、共用体union、枚举enum;指针*;void 空类型 无返回值、无具体数据。sizeof 求变量/类型所占内存字节大小。
- #define 宏定义? #define PI 3.14159 预处理文本替换,无类型检查;末尾不要加分号;可以宏常量、宏函数。和 const 区别:define 属于文本替换,无类型,不占内存,作用全局;const 是带类型常量,占内存,作用域{ }。
- 动态内存申请 malloc/calloc/realloc/free
- malloc:分配内存,不初始化 int *p = (int*)malloc(sizeof(int)*10);
- calloc:分配并初始化为 0 int *p = (int*)calloc(10,sizeof(int));
- realloc:重新调整内存大小
- free 释放;堆上内存;申请失败返回 NULL;用完必须 free,防止内存泄漏;free 后指针置 NULL,避免野指针。void free(int *p);
-
int *p = (int*)malloc(10*sizeof(int)); if(p == NULL){ //内存申请失败处理 }
- 栈和堆区别? 栈:局部变量,自动分配释放,空间小;堆:malloc/new 手动申请释放,空间大。
- 流程控制语句 分支:if‑else、switch‑case;循环:for、while、do‑while;跳转:break、continue、goto。 do‑while 至少执行一次;break 跳出整个循环;continue 跳过本次循环。switch 只能整型,缺少 break 会穿透。
- 指针注意事项 存储内存地址。防止野指针、空指针解引用、数组越界。指针 ++ 按类型字节偏移。 const 区分常量指针、指针常量。void * 不能直接解引用。不要返回局部变量地址。
- 结构体 struct 封装不同类型数据;访问成员
.;结构体指针->;存在内存对齐;传参建议传指针减少拷贝。 union 共用体成员共用一块内存。 - C 语言编译四步? 预处理→编译→汇编→链接。 gcc 编译 C,g++ 编译 C++;
‑c只编译生成.o 目标文件;‑o指定输出文件名。
三、C++
- C 和 C++ 区别? C 面向过程;C++ 面向对象兼容 C。C++ 新增:类、继承、多态、引用、重载、模板、STL。 C 用 malloc/free;C++ new/delete 会调用构造析构。
- 构造函数类型? 默认无参构造、有参构造、拷贝构造、C++11 移动构造。 拷贝构造参数必须是 const 本类引用;编译器默认拷贝构造是浅拷贝。
- 析构函数? ~ 类名,无返回值无参数,不能重载;对象销毁自动调用;建议 virtual 虚析构,防止子类析构不执行。
- 浅拷贝、深拷贝 浅拷贝:只复制成员值,指针复制地址,多个对象共用堆内存,析构重复释放崩溃。 深拷贝:开辟新独立堆内存。类有堆指针,需要手写拷贝构造、赋值运算符重载,赋值运算符要判断自赋值。
- 访问权限 public private protected public:任意地方访问;private:仅本类内部;protected:本类 + 子类可访问,外部不行。 父类 private 子类永远访问不到。继承方式会改变子类中父类成员权限。
- Lambda 表达式(C++11) 匿名函数;
[捕获](参数)->返回值{}。[=]值捕获;[&]引用捕获;值捕获拷贝副本;引用捕获注意变量销毁野引用。 - 三目运算符
条件?表达式1:表达式2;运算符有返回值;右结合,嵌套建议加括号,适合简单二选一。 - string std::string;size/length 获取字符数;find 查找,失败返回 string::npos;substr 截取;c_str () 转为 char*;底层动态数组,小对象优化;传参建议
const string&。 - STL 容器
- 序列容器:vector (连续数组随机访问,中间插入慢)、deque、list (双向链表,插入快不支持随机访问)
- 关联容器 map/set 红黑树,有序 O (logn)
- 无序 unordered_map/unordered_set 哈希表,平均 O (1) 无序
- 适配器 stack、queue、priority_queue
vector 扩容:重新分配内存拷贝数据,迭代器失效。 list 插入删除不会使迭代器失效。
- malloc/free vs new/delete malloc/free 库函数,只分配释放内存,不调用构造析构; new/delete 运算符,分配内存调用构造,释放调用析构。
- 虚函数、纯虚函数 virtual 虚函数实现多态;纯虚函数
virtual func()=0,抽象类不能实例化。
浙公网安备 33010602011771号