🔧
C++ 面试题
4 道题 · 2 个模块
简单 2中等 1困难 1
基础语法
2 题Q1.指针和引用的区别?简单
Q1.指针和引用的区别?
参考答案
| | 指针 | 引用 |
|---|------|------|
| 语法 | int* p = &x; | int& r = x; |
| 空值 | nullptr | 必须初始化 |
| 重新绑定 | ✅ p = &y | ❌ 始终指向初始对象 |
| 解引用 | *p | 直接使用 r |
| 运算 | ✅ 指针算术 | ❌ |
引用更安全(不能为空),指针更灵活。能用引用就不用指针。Q2.C++ 中 const 的各种用法?简单
Q2.C++ 中 const 的各种用法?
参考答案
cpp
const int x = 10; // 常量值
const int* p = &x; // 指向常量的指针(不能改值)
int* const p = &x; // 常量指针(不能改指向)
const int* const p = &x; // 都不能改
void func() const; // 常量成员函数——不修改成员变量
const int& func(); // 返回常量引用
口诀:const 在 * 左边修饰值,在 * 右边修饰指针。内存管理
2 题Q1.栈和堆的区别?new/delete 和 malloc/free 的区别?中等
Q1.栈和堆的区别?new/delete 和 malloc/free 的区别?
参考答案
**栈**:自动分配释放,速度快,空间有限(~MB)。局部变量。
**堆**:手动分配释放,速度较慢,空间大(受限于 RAM)。
cpp
int* p1 = new int(42); // C++:调用构造函数
delete p1;
int* p2 = (int*)malloc(sizeof(int)); // C:不调用构造函数
*p2 = 42;
free(p2);
**用 new/delete**——调用构造/析构函数。malloc/free 只分配内存。Q2.智能指针 unique_ptr、shared_ptr、weak_ptr 的区别?困难
Q2.智能指针 unique_ptr、shared_ptr、weak_ptr 的区别?
参考答案
cpp
// unique_ptr:独占所有权——不能拷贝,只能移动
auto p1 = std::make_unique<int>(42);
auto p2 = std::move(p1); // 所有权转移,p1 变 nullptr
// shared_ptr:共享所有权——引用计数
auto s1 = std::make_shared<int>(42);
auto s2 = s1; // 引用计数 = 2
// weak_ptr:弱引用——不增加计数,防止循环引用
std::weak_ptr<int> w = s1;
if (auto sp = w.lock()) { // 使用时需 lock
// 使用 sp
}
默认用 unique_ptr,需要共享时用 shared_ptr,防止循环引用用 weak_ptr。