C/C++ 核心能力

阶段1 | 第1-4周

📅 4周详细学习计划

第1周:指针与内存

• 指针与引用区别
• 栈/堆内存模型
• 智能指针基础
• const指针用法

第2周:模板编程

• 函数模板/类模板
• 模板特化
• 变参模板
• SFINAE/enable_if

第3周:STL深入

• 容器底层实现
• 迭代器失效
• 算法复杂度
• Lambda表达式

第4周:现代C++

• move语义
• perfect forwarding
• constexpr
• structured bindings

1. 指针与内存管理

1.1 指针基础

// 指针与数组的关系
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]

1.2 引用 vs 指针

1.3 内存模型

// 栈 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;
}

2. 模板编程

2.1 函数模板

// 函数模板进阶
// 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;
}

2.2 类模板

2.3 变参模板

// 变参模板示例
// 递归展开
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 + ...);  // 一元右折叠
}

3. RAII与智能指针

3.1 RAII原则

3.2 智能指针详解

// 智能指针最佳实践
// 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
};

4. STL容器与算法

4.1 容器选择指南

4.2 迭代器失效

4.3 Lambda表达式

// 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; });

5. 现代C++特性

5.1 Move语义

5.2 Perfect Forwarding

5.3 其他现代特性

// 现代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;
}

🛠️ 实践项目

📚 学习资源