1. C++笔试高频考点解析
作为一门经久不衰的系统级编程语言,C++在技术面试中始终占据重要地位。根据近三年一线互联网企业的面试统计,指针与内存管理类题目出现频率高达78%,面向对象特性相关题目占比65%,而模板与STL的考察率也达到了52%。这些数据清晰地揭示了C++面试的核心考察方向。
1.1 指针与内存管理实战
指针作为C++的灵魂特性,其相关题目往往能直接检验候选人的底层功底。来看这道经典题目:
cpp复制int main() {
int *p = new int(10);
int *q = p;
delete p;
cout << *q << endl; // 会发生什么?
}
这个案例展示了典型的悬垂指针问题。当delete p执行后,q仍然指向已被释放的内存区域,此时访问*q会导致未定义行为。在实际工程中,这类问题可能表现为随机崩溃或数据损坏。正确的做法应该是在删除后将指针置空:
cpp复制delete p;
p = nullptr; // 同时q也应该置空
深度思考题:为什么C++不自动将被delete的指针置空?这其实体现了C++"不为不需要的功能付出代价"的设计哲学。自动置空会增加运行时开销,而系统级编程往往需要精确控制每一个CPU周期。
1.2 面向对象特性深度剖析
虚函数机制是C++多态的基石。面试中常要求手写虚函数表示例:
cpp复制class Base {
public:
virtual void show() { cout << "Base show" << endl; }
virtual ~Base() {} // 虚析构的必要性
};
class Derived : public Base {
public:
void show() override { cout << "Derived show" << endl; }
};
int main() {
Base* b = new Derived();
b->show(); // 输出什么?
delete b;
}
这里有几个关键点:
override关键字(C++11)明确表示重写虚函数- 虚析构函数确保通过基类指针删除派生类对象时能正确调用派生类析构
- 虚函数表(vtable)的实现机制是常考点
经验提示:面试官常会追问"如果不加virtual会怎样?"——此时将发生静态绑定,输出"Base show"
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STL与模板编程精要
2.1 容器底层实现揭秘
vector的动态扩容机制是高频考点。当面试官问"vector的push_back时间复杂度是多少?",合格的回答应该是:
"平均O(1),因为虽然单次扩容需要O(n)时间,但均摊到每次操作仍是常数时间。vector通常按2倍或1.5倍扩容,这是空间和时间效率的平衡。"
验证代码示例:
cpp复制vector<int> v;
for (int i = 0; i < 100; ++i)
