
一、<<CPP面试冲刺周刊>> 产生背景
各位老师好
CPP面试冲刺周刊 (c++ weekly)第三期开始了
目标:不是成为C++专家,而是成为C++面试专家
本期内容:指针与引用区别

c++周刊目的陪你一起快速冲击大厂面试
小提示:不要把他看成一个出售给你产品,我只出售给自己 在公司做任何事情事情, 都必须清楚拆解需求功能,开发周期,最后得到什么结果, 同样面试准备也是如此,给自己一个期限 21 天,给自己大纲,然后给自己 21 天学习结果,这样自己才能安心准备下去。

曾经有一个让我心跳加速的岗位放在我面前,
我没有珍惜。
等到别人拿到 offer 的那一刻,
我才追悔莫及!
人世间,最痛苦的事情,
不是没钱吃饭,
也不是没房没车,
而是——错过了那个能让我逆天改命的机会!
如果上天再给我一次机会,
我一定会对那个岗位说三个字:
“我要你!”
如果非要在这份“心动”上加一个期限,
一万年太久了……
我只想要——21天!
你可能面临两种选择
“这个岗位太难了,我先准备一下吧。”
于是你准备1天、1周、1个月、1年……
等再回头,3年就这样过去了。
终于等来一场面试,
你觉得问题很简单,张口就答,
结果用“几千元思维”回答“百万年薪岗位”。
一次面试失利,也许就意味着和理想岗位失之交臂。
在你犹豫的这几年里,
找工作的成本越来越高:
等你回过头来,发现不仅机会没了,
连准备的方向都变了。
21天C++面试冲刺周刊

不是让你成为C++专家, 而是让你成为C++面试专家。
不是让你疯狂学习新知识, 而是帮你重新整理已有知识,
让你的能力与面试题精准对齐。
因为,21天就够了,
足够让我火力全开,
让你学到每个 c++知识,都关联一个经典面试,并对对应开源项目实践
这也是我的面试方法:
NULL,而指针可以为 NULL;


于是小青继续补充了几点:
sizeof(pointer) 固定是 8 个字节;ptr++ → 偏移一个对象的地址;ref++ → 直接让变量本身加 1小青疑惑:为什么我全部回答了,面试官还是不满意 ,我回答不高深吗?
核心原则:
需要频繁更新数据结构:
数据结构 | 为什么用指针 | 为什么不用引用 |
|---|---|---|
|
|
|
|
|
|
|
|
|
B+ 树 / B 树 |
|
|
其他容器( |
|
|
举例说明: 为什么 std::vector 内部必须用指针
源码(libstdc++ 实现,<bits/stl_vector.h>):
template<typename _Tp, typename _Alloc = std::allocator<_Tp>>
class vector {
_Tp* _M_start; // 指向首元素
_Tp* _M_finish; // 指向最后一个元素后
_Tp* _M_end_of_storage; // 指向容量的末尾
};原因:
vector 会在容量不足时 realloc,需要把所有元素搬迁到新内存区域。T&),原来的绑定会失效 → 语义崩溃。vector 初始化时 _M_start = nullptr。vector<T> 支持任意类型 T,不要求 T 必须可引用。“延长初始化”是指 对象的真正初始化推迟到需要使用它的那一刻,
而不是在对象声明的时候立刻初始化。
在数据库、存储系统、分布式架构中非常常见,比如:
在这种情况下,指针 比 引用 更适合,主要原因是引用一旦绑定,就必须立即指向一个已初始化的对象,而指针可以:
nullptr系统 | 延迟加载对象/数据 | 延迟加载元数据 | 指针/引用作用 |
|---|---|---|---|
Ceph | ✅ ObjectCacher | ✅ OMAP / Metadata | 延迟分配 + 内存管理 |
TiKV | ✅ Block / SST | ✅ Region Info | 指针/block handle 延迟访问 |
3FS | ✅ 对象页 | ✅ 元数据页 | 指针/智能指针管理内存 |
3FS offers an innovative caching mechanism known as KVCache.
Traditional DRAM-based caching can be both expensive and limited in capacity,
but KVCache provides a cost-effective alternative that delivers high throughput and a larger cache capacity.
3FS 提供了一种名为 KVCache 的创新缓存机制。传统的基于 DRAM 的缓存不仅价格昂贵,容量也有限,而 KVCache 则提供了一种经济高效的替代方案,能够提供高吞吐量和更大的缓存容量
这不就是 stl map 结构,redis 吗?kvCache 也不是神秘面纱
在 C++ 的世界里,
资源所有权的界限非常清晰:**new和 delete必须成对出现,
由指针全权负责;
比如你 new 一个对象,系统给你分配内存,这块内存的“所有权”属于你。
你需要用 delete 手动释放,否则就会内存泄漏。
而 引用本质上只是对象的别名,它不拥有资源,不负责释放。赋值引用不会复制对象,也不会影响对象生命周期。
而引用根本不参与资源的创建与释放**。
MyClass obj;
MyClass& ref = obj;
// 只是别名,不创建新对象
// 无 release() 或 delete ref 的操作!
delete ref;//语法报错 从语法层面避免这个操作所以:
**指针=拥有权,需要管理生命周期;
引用=别名,不管理生命周期

核心原理:

【Modern Cpp】从万能引用到完美转发
万能引用(Universal Reference)由Effective C++系列的作者Scott Meyers提出,
其对万能引用的定义如下:
If a variable or parameter is declared to have type T&& for some deduced type T, that variable or parameter is a universal reference.
void fun(int &&a) { // a为右值引用
// do sth
}
int main() {
int a = 1;
fun(a);
// 编译器报错 没有函数重载 错误:无法将左值‘int’绑定到‘int&&’
fun(1); // OK
}
template <typename T>
fun(T &&a) 编译时场景 | 为什么用万能引用 |
|---|---|
| 接收左值/右值都能正确构造对象 |
函数模板转发参数 | 避免不必要拷贝,保持原有值类别 |
泛型工厂函数 | 构造对象并返回,左值/右值都高效处理 |
你一定会很奇怪,为什么万能引用的形式明明是T&&,
却既可以代表左值又可以代表右值。这就要涉及到C++的引用折叠语法了。
1️⃣ 普通右值引用 vs 万能引用
int&& xstd::move结果)template<typename T> void f(T&& t)2️⃣ 模板推导规则
模板函数参数 T&& 会触发引用折叠规则:
调用情况 | T 推导结果 | 函数参数类型 |
|---|---|---|
传左值 | T = |
|
传右值 | T = |
|
关键点:引用折叠使得原本的右值引用
T&&变成了左值引用,从而可以绑定左值。undefined所以万能引用的能力来源于模板推导 + 引用折叠,而不是缺少引用类型。
为什么 T&& 还要 std::forward?
template<typename T>
void wrapper(T&& t) {
func(t); // ❌ t 是左值还是右值?可能失去右值语义
func(std::forward<T>(t)); // ✅ 完美转发
}T&& t 是万能引用(forwarding reference)t 在函数体内总是左值,即便原始传入的是右值2️⃣ 问题func(t):决:std::forward<T>(t) 重载不同类型处理方法,很 easy架构师才 不关心基于指针语法,
关心可维护,上线后不出事故,
哪怕出了事故,必须可控制,而不是丢数据致命问题
特性 | C++ 指针 | C++ 引用 | Rust 引用 & 生命周期 |
|---|---|---|---|
本质 | 存储地址 | 对象别名 | 对象借用,编译器跟踪生命周期 |
是否拥有资源 | 可拥有(需要 delete) | 不拥有 | 不拥有,所有权由编译器追踪 |
初始化要求 | 可为 nullptr,随时赋值 | 必须初始化,不可为 nullptr | 必须指向有效对象,借用检查保证安全 |
生命周期管理 | 手动(裸指针)或智能指针 | 不管理生命周期 | 编译器管理,自动释放 |
安全性 | 容易悬挂或泄漏 | 安全,但不可重新绑定 | 编译期保证安全,无悬挂 |
使用场景 | 缓存、大对象、懒加载、动态分配 | 函数参数、别名访问 | 所有引用/借用、函数参数、高安全要求 |
可变性控制 | 指针指向可变或不可变对象 | 与原对象一致 | 可借用(不可变)或可变借用,编译器保证互斥 |
举例:
fn safe() -> &i32 { // 编译错误!需要生命周期注解。
let x = 5;
&x // 错误!编译器拒绝:`x` 的生命周期不够长。
}在对象内部或容器中存储时:
std::unique_ptrstd::shared_ptrstd::weak_ptr序号 | 知识地图 | 题目 |
|---|---|---|
1 | 新特性 | |
2 | 库的编译链接 | |
3 | STL | |
4 | 新特性 | |
5 | 新特性 | |
6 | 模板 | |
7 | class | |
8 | 编译器 | |
9 | 值语义 | |
10 | 值语义 | |
11 | 指针 | |
12 | 指针 |
1️⃣ 如果有更多疑问,联系小王,一起交流,进步
2️⃣ 关注公众号:后端开发成长指南(回复"面经"获取)获取过去我全部面试录音和面试复盘。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。