C++ 进阶核心知识点整理
对 C++ 的中级核心知识点进行系统整理,这能帮助你突破基础层面,理解 C++ 的底层机制和工程化开发的关键技术,是从 "会用" 到 "用好" 的核心跨越。以下整理聚焦底层原理、工程化实践、现代 C++ 特性三大维度,兼顾深度和实用性。
一、C++ 内存模型与管理(中级核心)
1. 内存分区模型(底层核心)
| 分区 | 存储内容 | 生命周期 | 特点 |
|---|---|---|---|
| 栈(Stack) | 局部变量、函数参数、返回值 |
系统整理了 C++ 中级核心知识点,涵盖内存模型与管理、面向对象进阶、现代 C++ 特性及工程化与性能优化四大维度。重点讲解了内存分区、RAII、智能指针、虚函数表、模板编程、移动语义等底层原理与实践技巧,旨在帮助开发者从“会用”跨越到“用好”,提升代码稳定性与可维护性。
对 C++ 的中级核心知识点进行系统整理,这能帮助你突破基础层面,理解 C++ 的底层机制和工程化开发的关键技术,是从 "会用" 到 "用好" 的核心跨越。以下整理聚焦底层原理、工程化实践、现代 C++ 特性三大维度,兼顾深度和实用性。
| 分区 | 存储内容 | 生命周期 | 特点 |
|---|---|---|---|
| 栈(Stack) | 局部变量、函数参数、返回值 |
| 随作用域创建 / 销毁 |
| 自动管理,速度快,空间小(几 MB) |
| 堆(Heap) | new/malloc分配的内存 | 手动delete/free释放 | 手动管理,空间大(GB 级),易泄漏 |
| 全局 / 静态区 | 全局变量、static变量 | 程序启动到结束 | 整个程序生命周期唯一实例 |
| 常量区 | 字符串常量、const常量 | 程序启动到结束 | 只读,不可修改 |
| 代码区 | 编译后的二进制指令 | 程序启动到结束 | 只读,共享 |
关键考点:
// 示例:内存分区验证
int global_var = 10; // 全局区
static int static_var = 20; // 静态区
const int const_var = 30; // 常量区
void test() {
int local_var = 40; // 栈
int* heap_var = new int(50); // 堆
char* str = "hello"; // "hello"在常量区,str在栈
delete heap_var; // 必须释放堆内存
}
// 自定义 RAII 类管理文件句柄
class FileGuard {
private:
FILE* fp;
public:
explicit FileGuard(const char* path, const char* mode) {
fp = fopen(path, mode);
if (!fp) throw runtime_error("文件打开失败");
}
~FileGuard() { // 析构自动释放
if (fp) fclose(fp);
}
// 禁用拷贝(避免 double free)
FileGuard(const FileGuard&) = delete;
FileGuard& operator=(const FileGuard&) = delete;
// 提供访问接口
FILE* get() const { return fp; }
};
// 使用:无需手动 close,出作用域自动释放
void useFile() {
FileGuard fg("test.txt", "r"); // 操作文件...
}
// 析构自动 fclose
| 类型 | 所有权 | 适用场景 | 注意事项 |
|---|---|---|---|
unique_ptr | 独占所有权 | 单一所有者的资源 | 不可拷贝,可移动(std::move) |
shared_ptr | 共享所有权 | 多对象共享资源 | 避免循环引用(配合weak_ptr) |
weak_ptr | 弱引用 | 解决shared_ptr循环引用 | 需lock()转为shared_ptr使用 |
auto_ptr | 独占(已废弃) | C++11 前,被unique_ptr替代 | 拷贝语义有问题,禁止使用 |
循环引用解决示例:
#include <memory>
class B; // 前向声明
class A {
public:
weak_ptr<B> b_ptr; // 用 weak_ptr 而非 shared_ptr
~A() { cout << "A 析构" << endl; }
};
class B {
public:
shared_ptr<A> a_ptr;
~B() { cout << "B 析构" << endl; }
};
void test() {
shared_ptr<A> a = make_shared<A>();
shared_ptr<B> b = make_shared<B>();
a->b_ptr = b;
b->a_ptr = a; // 无循环引用,析构正常执行
}
new/delete的系统调用开销。// 简易内存池示例
class MemoryPool {
private:
char* pool; // 内存池起始地址
size_t pool_size; // 总大小
size_t used_size; // 已使用大小
public:
MemoryPool(size_t size) : pool_size(size), used_size(0) {
pool = new char[size]; // 预分配
}
~MemoryPool() { delete[] pool; }
// 分配内存
void* allocate(size_t size) {
if (used_size + size > pool_size) {
throw bad_alloc();
}
void* ptr = pool + used_size;
used_size += size;
return ptr;
}
// 简化版:不实现 free(实际需更复杂的空闲块管理)
void deallocate(void* ptr) {}
};
// 使用
MemoryPool pool(1024 * 1024); // 1MB 内存池
int* p1 = (int*)pool.allocate(sizeof(int));
char* p2 = (char*)pool.allocate(100);
关键结论:
=0)使类成为抽象类,不能实例化;final关键字禁止类继承 / 函数重写,override显式标记重写(编译器检查)。// 菱形继承问题:B、C 都继承 A,D 继承 B、C,A 的成员会有两份
class A {
public:
int a;
};
class B : virtual public A {}; // 虚继承
class C : virtual public A {}; // 虚继承
class D : public B, public C {}; // 使用:只有一份 A 的成员
D d;
d.a = 10; // 无歧义
// 组合示例(优于继承)
class Engine {
public:
void start() { cout << "引擎启动" << endl; }
};
class Car {
private:
Engine engine; // 组合 Engine
public:
void start() {
engine.start(); // 复用 Engine 功能
cout << "汽车启动" << endl;
}
};
// 通用交换函数
template <typename T>
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
// 使用
int x=1, y=2;
swap(x, y); // 实例化为 swap<int>
double a=3.14, b=5.67;
swap(a, b); // 实例化为 swap<double>
// 通用栈模板
template <typename T, size_t N>
class Stack {
private:
T data[N];
size_t top;
public:
Stack() : top(0) {}
void push(const T& val) {
if (top < N) data[top++] = val;
}
T pop() {
if (top > 0) return data[--top];
throw runtime_error("栈空");
}
};
// 使用
Stack<int, 10> int_stack; // int 类型,容量 10
Stack<string, 5> str_stack; // string 类型,容量 5
// 通用模板
template <typename T>
class TypeTraits {
public:
static const bool is_int = false;
};
// 特化:int 类型
template <>
class TypeTraits<int> {
public:
static const bool is_int = true;
};
// 使用
cout << TypeTraits<double>::is_int << endl; // 0
cout << TypeTraits<int>::is_int << endl; // 1
&&右值引用)10、"hello"),无名称,不能取地址。class MyString {
private:
char* data;
size_t len;
public:
// 构造函数
MyString(const char* str) {
len = strlen(str);
data = new char[len+1];
strcpy(data, str);
}
// 拷贝构造(深拷贝)
MyString(const MyString& other) {
len = other.len;
data = new char[len+1];
strcpy(data, other.data);
}
// 移动构造(浅拷贝,转移资源)
MyString(MyString&& other) noexcept {
len = other.len;
data = other.data; // 转移指针
other.data = nullptr; // 原对象置空,避免析构释放
other.len = 0;
}
~MyString() {
if (data) delete[] data;
}
};
// 使用:移动构造
MyString getString() {
return MyString("test"); // 返回临时对象(右值)
}
MyString s = getString(); // 调用移动构造,无深拷贝
std::forward)template <typename T>
void wrapper(T&& arg) {
func(std::forward<T>(arg)); // 完美转发
}
void func(int& x) {
cout << "左值引用" << endl;
}
void func(int&& x) {
cout << "右值引用" << endl;
}
// 使用
int a = 10;
wrapper(a); // 左值,调用 func(int&)
wrapper(20); // 右值,调用 func(int&&)
auto:推导变量类型(必须初始化);decltype:推导表达式类型;decltype(auto):结合 auto 和 decltype,推导返回值类型。// decltype(auto) 示例
int x = 10;
decltype(auto) y = x; // int(x 是左值)
decltype(auto) z = (x); // int&((x) 是左值表达式)
// 函数返回值推导
template <typename T, typename U>
decltype(auto) add(T&& a, U&& b) {
return a + b;
}
| 特性 | 作用 | 示例 |
|---|---|---|
constexpr | 编译期计算 | constexpr int square(int x) { return x*x; } |
lambda 表达式 | 匿名函数 | auto f = [](int x) { return x*2; }; |
std::optional | 处理可能为空的值 | optional<int> getVal() { return 10; } |
std::variant | 类型安全的联合体 | variant<int, string> v = "hello"; |
range-based for | 简化容器遍历 | for (auto& x : vec) { ... } |
noexcept标记函数不抛出异常(编译器优化);// 异常安全的函数
void safeFunc() noexcept { // 不会抛出异常的代码
}
// 异常捕获层级
try {
// 可能抛异常的代码
throw runtime_error("错误");
} catch (const runtime_error& e) { // 处理运行时异常
} catch (const exception& e) { // 处理所有标准异常
} catch (...) { // 处理未知异常
}
const&传参;alignas指定对齐方式,提升缓存命中率;-O2/-O3(Release 模式)。NULL:使用nullptr;goto:用循环 / 函数替代;constexpr:编译期确定值;这些中高级知识点是 C++ 开发的核心壁垒,建议结合实际项目(如高性能服务器、游戏引擎、嵌入式开发)反复实践,才能真正理解和掌握

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online