Z
ZHANK
🔧

C++ 面试题

4 道题 · 2 个模块

简单 2中等 1困难 1

基础语法

2
Q1.指针和引用的区别?
简单
参考答案
| | 指针 | 引用 |
|---|------|------|
| 语法 | int* p = &x; | int& r = x; |
| 空值 | nullptr | 必须初始化 |
| 重新绑定 | ✅ p = &y | ❌ 始终指向初始对象 |
| 解引用 | *p | 直接使用 r |
| 运算 | ✅ 指针算术 | ❌ |

引用更安全(不能为空),指针更灵活。能用引用就不用指针。
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 的区别?
中等
参考答案
**栈**:自动分配释放,速度快,空间有限(~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 的区别?
困难
参考答案
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。