CppStack

C++技术栈一站式学习 · ‌业精于勤,荒于嬉;行成于思,毁于随。

C++ 学习阶段一:现代 C++ 基础(1–2 个月)

Tags = [ C++Study ]

学习目标

  • 掌握现代 C++ 的基本语法与核心思想
  • 理解内存与资源管理,避免常见错误
  • 熟悉 C++11 以来的现代特性(autonullptr、智能指针、lambda 等)
  • 能够使用 CMake 构建小型项目,使用 Git 管理代码
  • 初步参与开源项目,培养职业化开发习惯

职业价值:能读懂主流代码库,独立开发小型功能模块,并具备团队协作的基本能力。


1. 基础语法与面向对象

1.1 基本语法

  • 变量与常量:int, double, const, constexpr
  • 控制结构:if, switch, for, while
  • 函数:值传递、引用传递、默认参数
#include <iostream>
using namespace std;

int add(int a, int b) {
    return a + b;
}

int main() {
    const int x = 10;
    int y = 20;
    cout << add(x, y) << endl;
}

1.2 面向对象

  • 类与对象
  • 构造函数、析构函数
  • 封装、继承、多态
#include <iostream>
using namespace std;

class Animal {
public:
    virtual void speak() { cout << "Animal sound\n"; }
    virtual ~Animal() = default; // 虚析构函数
};

class Dog : public Animal {
public:
    void speak() override { cout << "Woof!\n"; }
};

int main() {
    Animal* a = new Dog();
    a->speak(); // 输出 Woof!
    delete a;
}

2. 内存与资源管理

2.1 指针与引用

  • 指针:存储地址,可为空
  • 引用:别名,必须初始化,不可更换绑定对象
int x = 42;
int* p = &x;   // 指针
int& r = x;    // 引用

2.2 RAII 思想

RAII(Resource Acquisition Is Initialization):资源获取即初始化,利用对象生命周期管理资源。

#include <fstream>
#include <string>

void writeFile(const std::string& filename) {
    std::ofstream file(filename); // 构造时打开文件
    file << "Hello RAII\n";       // 析构时自动关闭文件
}

3. 现代 C++ 特性(C++11 起)

3.1 auto 类型推导

auto x = 10;       // int
auto y = 3.14;     // double
auto z = "hello";  // const char*

3.2 nullptr

替代 NULL,类型安全。

int* p = nullptr;

3.3 范围 for 循环

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v = {1, 2, 3};
    for (auto n : v) {
        cout << n << " ";
    }
}

3.4 智能指针

  • unique_ptr:独占所有权
  • shared_ptr:共享所有权
  • weak_ptr:弱引用,避免循环引用
#include <memory>
#include <iostream>
using namespace std;

int main() {
    auto p = make_unique<int>(42);
    cout << *p << endl;

    auto sp1 = make_shared<int>(100);
    auto sp2 = sp1; // 引用计数 +1
    cout << *sp2 << endl;
}

3.5 Lambda 表达式

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v = {3, 1, 4};
    sort(v.begin(), v.end(), [](int a, int b) { return a < b; });
    for (auto n : v) cout << n << " ";
}

4. 工具链入门

4.1 CMake 基础

CMakeLists.txt 示例:

cmake_minimum_required(VERSION 3.10)
project(HelloCMake)

set(CMAKE_CXX_STANDARD 17)

add_executable(hello main.cpp)

构建流程:

mkdir build && cd build
cmake ..
make
./hello

4.2 Git 基础

git clone <repo-url>
git checkout -b feature/my-task
git add .
git commit -m "fix: correct memory leak in module"
git push origin feature/my-task

5. 学习建议与实践

5.1 参与开源项目

  • 选择合适的项目:从小型、活跃的 C++ 项目入手(如 fmtjson)。
  • 阅读代码:先从 examples/tests/ 目录入手,理解项目结构。
  • 提交 bug:运行测试,尝试在不同平台编译,发现潜在问题。
  • 参与修复:从修复文档错误、改进注释、修复小 bug 开始,逐步深入核心代码。

5.2 实践路径

  1. 第 1 周:阅读并运行一个小型开源库,理解其构建方式(CMake)。
  2. 第 2 周:尝试修改代码,提交第一个 Pull Request(哪怕是文档修复)。
  3. 第 3–4 周:定位并修复一个小 bug,或为项目增加一个简单测试用例。
  4. 第 5–6 周:在项目 issue 区参与讨论,尝试解决一个功能性问题。

5.3 职业化收获

  • 学会阅读真实工程代码,而不仅是教材示例
  • 熟悉 GitHub/GitLab 的协作流程(fork、branch、PR、review)
  • 提升代码规范意识(遵循项目的 CONTRIBUTING.mdclang-format 配置)
  • 积累开源贡献记录,为简历加分

阶段一总结

  • 语法层面:掌握类、继承、多态、函数、引用与指针
  • 现代特性autonullptr、智能指针、lambda、范围 for
  • 工程化:CMake 构建、Git 协作
  • 实践产出:在开源项目中完成至少一次有效贡献(bug 修复、文档改进、测试用例)

完成阶段一后,你不仅能写出现代 C++ 代码,还能 融入真实工程环境,具备初步的团队协作与开源贡献经验,为后续 STL 与泛型编程学习打下坚实基础。