C++面试知识点汇总

C++面试知识点汇总

  本博文是本文历时3个月,收集各种资料,汇总的C++面试题,欢迎各位博友评价。

1.C/C++内存有哪几种类型

  C中内存分为5个区:堆(malloc),栈(如:局部变量,函数参数),程序代码区(存放二进制代码),全局/静态存储区(全局变量,static变量)和常量存储区(常量)。
  全局变量/static变量会初始化为零,而堆和栈上的变量是随机的,不确定的。

  • 堆:用于程序内存动态分配,用C/C++中的new/malloc分配,delete/free释放,堆是C/C++函数库提供的;
  • 栈:在程序运行中,局部作用域出现的一些局部变量可以在栈上创建,等脱离该作用域创建的内存被释放;
  • 全局/静态存储区:这块内存在程序编译期间已经分配好,在程序整个运行阶段一直存在;
  • 常量存储区:特殊的一块内存,里面存放的常量,不允许修改。

2.堆内存、栈内存的对比:

  1. 栈内存 存储的是局部变量,而堆内存存储的是实体;
  2. 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
  3. 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

3.堆和自由存储区的区别

  总得来说,堆是C语言和操作系统的术语,是操作系统维护的一块动态分配的内存;自由存储是C++中通过new与delete动态分配和释放的抽象概念,他们并不完全一样。
  直接的说:堆用来存放动态分配的对象,通过malloc创建,free释放;而自由存储区是C++中通过new和delete动态分配和释放对象的抽象概念。
  通过new来申请的内存区域可称为自由存储区。

4.程序编译的过程

在这里插入图片描述1)预处理:对所有的define进行宏替换,处理所有的条件编译#idef等; 处理#include指令;删除注释等。
2)编译:将预处理后的文件进行词法分析,语法分析,语义分析以及优化相应的汇编文件。
3)优化
4)汇编:将汇编文件转化与机器能执行的文件
5)链接:包括地址和空间分配,符号决议和重定位。

5.什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?

  用动态存储分配函数动态开辟的空间,使用完毕后未释放,结果导致一直占据该内存单元,即为内存泄露。
  采用以下方法:
1)使用的时候要记得指针的长度;
2)malloc的时候得确定在哪里free;
3)对指针赋值的时候应该注意被赋值指针需要不需要释放;
4)动态分配内存的指针最好不要再次赋值;
5)在C++中应该优先考虑使用智能指针。

6.哈希表的构造方法及解决冲突的方法

构造方法:
1)数字分析法;
2)平方取中法;
3)分段叠加法;
4)除留余数法 ;
5)随机数法;
处理冲突的方法:
1)开放地址法;
2)再哈希法;
3)拉链法;
4)建立公共溢出区;

7.const 有什么用途?

1)定义只读变量,或者常量;
2)修饰函数的参数和函数的返回

<think>好的,我需要总结用户关于C++面试常见知识点的需求。用户提供了三个引用来源,看起来都是关于C++面试题和知识点的资料。首先,我应该从这些引用中提取关键点,整理成结构化的内容。 首先,用户提到的引用[1]和[2]中提到了很多基础概念,比如static关键字、四种cast转换、指针和引用的区别、智能指针、虚函数、析构函数、const的使用等。这些都是C++面试中的常见问题。引用[3]则涉及到了引用和指针的区别,以及三目运算符的例子。我需要把这些内容分门别类,确保覆盖主要知识点。 接下来,用户希望知识点总结结构清晰,帮助解决问题。因此,我需要将内容分成几个主要部分,比如基础知识、面向对象、内存管理、标准库等。每个部分下列举具体的问题和简要解答,同时注意使用中文,并且按照系统指令正确使用LaTeX格式。 要注意用户提到的系统级指令,比如行内数学表达式用$...$,独立公式用$$...$$。不过在当前的回答中,可能涉及代码块较多,数学公式较少,但如果有的话需要正确应用。例如,在解释某些算法或内存地址计算时可能需要数学表达式。 另外,用户要求生成相关问题,放在最后。这些问题需要围绕C++面试知识点展开,覆盖不同部分的内容,帮助用户进一步复习。 需要确保LaTeX语法正确,例如代码中的变量或表达式使用$符号包裹。同时,回答中的引用标识要自然添加,但用户提供的引用内容可能没有直接对应的文献,所以可能需要根据现有引用内容适当标注,比如引用[^1]、[^2]、[^3]。 最后,检查是否有遗漏的重要知识点,比如多态、虚函数表、智能指针的实现、STL容器区别等,确保覆盖用户提供的引用中的内容,并按照逻辑组织,便于用户理解和复习。</think>以下是对C++面试常见知识点的结构化总结,结合基础语法、面向对象、内存管理等核心领域: --- ### 一、基础语法与关键字 1. **`static`关键字** - 修饰局部变量:延长生命周期至程序结束 - 修饰全局变量/函数:限制作用域为当前文件 - 修饰类成员:属于类而非对象,可通过类名直接访问[^1] 2. **`const`关键字** - 修饰变量:声明常量,如`const int MAX=100;` - 修饰成员函数:禁止修改对象成员,如`void func() const;` - 与指针结合:`const int* p`(指针可变,值不可变) vs `int* const p`(指针不可变,值可变)[^3] 3. **四种类型转换** - `static_cast`:基本类型转换(如`int`转`double`) - `dynamic_cast`:用于多态类型安全向下转型 - `const_cast`:移除`const`属性 - `reinterpret_cast`:低级别强制转换(如指针转整数)[^1] --- ### 二、面向对象特性 1. **虚函数与多态** - 虚函数表(vtable)实现运行时多态 - 纯虚函数定义接口:`virtual void func() = 0;` - **析构函数必须为虚函数**:确保派生类对象正确释放[^2] 2. **访问权限与继承** - `public`继承:基类成员权限不变 - `protected`继承:基类`public`成员变为`protected` - `private`继承:基类所有成员变为`private`[^1] 3. **重载、覆盖与隐藏** - 重载(Overload):同名函数参数不同 - 覆盖(Override):派生类重写基类虚函数 - 隐藏(Hide):派生类函数屏蔽基类同名函数[^2] --- ### 三、内存管理 1. **智能指针** - `unique_ptr`:独占所有权,不可拷贝 - `shared_ptr`:引用计数共享所有权 - `weak_ptr`:解决`shared_ptr`循环引用问题[^2] 2. **`new/delete` vs `malloc/free`** - `new`调用构造函数,`malloc`仅分配内存 - `delete`调用析构函数,`free`直接释放内存 ```cpp int* p1 = new int(5); // 分配并初始化 int* p2 = (int*)malloc(sizeof(int)); // 仅分配 ``` 3. **内存泄漏与野指针** - 内存泄漏:未释放已分配内存(如忘记`delete`) - 野指针:指向无效内存的指针(如释放后未置空)[^2] --- ### 四、标准库与容器 1. **STL容器对比** | 容器 | 特点 | 时间复杂度(插入/查找) | |---------------|------------------------|-------------------------| | `vector` | 动态数组,随机访问快 | 尾部插入$O(1)$ | | `list` | 双向链表,插入删除快 | 任意位置插入$O(1)$ | | `map` | 红黑树实现,有序 | 查找$O(\log n)$ | | `unordered_map`| 哈希表实现,无序 | 查找平均$O(1)$ |[^2] 2. **迭代器与指针** - 迭代器提供统一访问接口,支持泛型编程 - 指针是原生类型,迭代器可能封装更复杂逻辑(如`map`的树遍历)[^2] --- ### 五、其他高频考点 1. **函数返回值处理** - 临时变量通过寄存器或栈传递,可能触发拷贝构造函数[^1] 2. **`volatile`关键字** - 禁止编译器优化,确保每次从内存读取变量(常用于多线程或硬件编程)[^1] 3. **位运算技巧** - 判断是否为2的倍数:`(n & (n-1)) == 0` - 统计二进制中1的个数:循环执行`n &= n-1`直到为0[^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值