• 指针与引用区别
• 栈/堆内存模型
• 智能指针基础
• const指针用法
• 函数模板/类模板
• 模板特化
• 变参模板
• SFINAE/enable_if
• 容器底层实现
• 迭代器失效
• 算法复杂度
• Lambda表达式
• move语义
• perfect forwarding
• constexpr
• structured bindings
// 指针与数组的关系 int arr[5] = {1, 2, 3, 4, 5}; int* p = arr; // 数组名退化为指针 sizeof(arr); // 20 (5 * 4 bytes) sizeof(p); // 8 (指针大小) // 指针运算 *(p + 2); // 等价于 arr[2],值为3 p++; // p现在指向arr[1]
// 栈 vs 堆 void stack_vs_heap() { int stack_var = 10; // 栈上,函数返回自动释放 int* heap_var = new int(10); // 堆上,需要delete // 栈溢出示例 int huge_array[1000000]; // ❌ 可能栈溢出 // 堆分配 int* safe_array = new int[1000000]; // ✅ 堆上分配 delete[] safe_array; }
// 函数模板进阶 // 1. 类型推导 template<typename T> T max_val(T a, T b) { return (a > b) ? a : b; } // 2. 非类型参数 template<int N> void fill_array(int (&arr)[N]) { for(int i=0; i// 3. 模板特化 template<> const char* max_val<const char*>(const char* a, const char* b) { return strcmp(a, b) > 0 ? a : b; }
// 变参模板示例 // 递归展开 template<typename T> T sum(T v) { return v; } template<typename T, typename... Args> T sum(T first, Args... rest) { return first + sum(rest...); } // C++17 折叠表达式 template<typename... Args> auto sum_fold(Args... args) { return (args + ...); // 一元右折叠 }
// 智能指针最佳实践 // 1. 优先使用make_unique/make_shared auto p1 = std::make_unique<Widget>(); auto p2 = std::make_shared<Widget>(); // 2. 传递unique_ptr(转移所有权) void process(std::unique_ptr<Widget> w); // 3. 传递shared_ptr(共享所有权) void process(std::shared_ptr<Widget> w); // 4. 不需要所有权时用裸指针或引用 void observe(const Widget& w); // 5. 循环引用示例 struct Node { std::shared_ptr<Node> next; // 应该用weak_ptr };
// Lambda实战 std::vector<int> v = {3, 1, 4, 1, 5, 9}; // 排序 std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; // 降序 }); // for_each std::for_each(v.begin(), v.end(), [](int x) { std::cout << x << " "; }); // lambda捕获 int threshold = 5; auto it = std::find_if(v.begin(), v.end(), [threshold](int x) { return x > threshold; });
// 现代C++特性 // 1. constexpr编译期计算 constexpr int factorial(int n) { return n <= 1 ? 1 : n * factorial(n-1); } constexpr int f10 = factorial(10); // 编译期计算 // 2. Structured Bindings auto [key, value] = *map.begin(); // C++17 // 3. std::optional std::optional<int> find(const std::vector<int>& v, int target) { for(auto x : v) if(x == target) return x; return std::nullopt; }