C++ 面试知识点总结

本文总结了C++面试中的关键知识点,包括static关键字的作用,如控制变量存储方式、常量限定符const的用法,以及extern声明外部变量。还探讨了基础语法问题,如堆栈区别、指针与引用的区别、重载与重写的差异,并讨论了C与C++的特点。同时,文章讲解了构造函数和析构函数不能为虚函数的原因,以及为什么基类析构函数需要是虚函数。

关键字

static:控制变量的存储方式和可见性

  1. 修饰局部变量 该变量存储区由栈区变为静态数据区,其生命周期延长到整个程序执行结束。该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。其作用域仍然是一个局部作用域。
  2. 修饰全局变量 改变了其作用域的范围,由原来的整个工程可见(extern)变为本源文件可见。
  3. 修饰函数 与修饰全局变类似,改变了函数的作用域。
  4. C++ 中的 static 修饰成员函数,表示该函数属于一个类而不是属于此类的任何特定对象,不接收 this 指针,因而只能访问类的 static 成员变量。修饰成员变量,表示该变量为类以及其所有的对象所有。它们在存储空间中都只存在一个副本,可以通过类和对象去调用。

const:常量限定符,告知编译器该变量是不可修改的

  • 修饰基本数据类型
  1. 修饰一般常量及数组 可以用在类型说明符前或类型说明符后。
  2. 修饰指针变量 * 及引用变量 & 位于星号的左侧,指针指向的变量为常量;位于星号的右侧,指针本身是常量。
  • 应用到函数中
  1. 修饰参数 进行常量化,保护了原对象的属性。通常用于参数为指针或引用的情况;
  2. 修饰返回值 按照"修饰原则"进行修饰,起到相应的保护作用。
  • 在类中的用法
  1. 修饰成员变量 初始化只能在类构造函数的初始化表中进行
  2. 修饰成员函数 不能修改所在类的的任何变量,重载函数的一个方式。
  • 修饰类对象,定义常量对象
  1. 只能调用常量函数,别的成员函数都不能调用。

extern: 外部变量/函数声明引用

  1. C 语言中,修饰变量/函数,表示此变量/函数是在别处定义的,要在此处引用。
    调用其它文件中的变量/函数,只需把该文件用#include包含进来即可,为啥要用 extern ?因为用 extern 会加速程序的编译过程,这样能节省时间。
  2. C++extern 还有另外一种作用,用于指示 C 或者 C++ 函数的调用规范。
    C++ 中调用C 库函数,extern “C” 声明要引用的函数。告诉链接器在链接的时候用 C 函数规范来链接。主要原因是 C++C 程序编译完成后在目标代码中命名规则不同,用此来解决名字匹配的问题。

volatile:易变的

  • 易变性。在汇编层面反映出来就是两条语句,下一条语句不会直接使用上一条语句对应的 volatile 变量的寄存器内容,而是重新从内存中读取。
  • “不可优化”特性volatile 告诉编译器不
<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、付费专栏及课程。

余额充值