C/C++ 入门

这篇是 CandCPP 知识图谱的入口。C++ 可以按不同目标分路线学习,但分叉不应该太早:基础语法、必要指针/内存、C++ 进阶、OOP 和 STL 都属于通用核心。完成通用核心后,再根据目标进入历史代码维护 / 学校课程加深,或现代 C++ 开发加深。

学习路线总览

通用核心主链

基础语法
  -> 输入输出 / 运算符 / 流程控制
  -> 数组 / 函数
  -> 指针 / const / 基础内存模型
  -> 枚举 / 结构体 / 预处理 / 文件操作
  -> cpp进阶
  -> 面向对象
  -> STL
  -> 分叉点

这条主链适合所有学习者。学校课程、历史代码维护和现代开发都需要先掌握这部分,只是后续加深方向不同。

分支 A:历史代码维护 / 学校课程加深

适合正在上 C/C++ 课程、教材偏 C 语言和传统 OOP,或者需要维护偏 C 风格老代码的学习者。

通用核心
  -> C 语言存储类型 / malloc free / 常用库
  -> new/delete 与手动资源管理
  -> 对象特性 / 继承 / 多态细节
  -> 模板基础和传统模板规则
  -> 底层知识和深水区按需查阅

这条分支的重点是理解 C++ 的历史继承关系、C 兼容层、手动内存、传统 OOP 和老代码常见写法。

分支 B:现代 C++ 开发加深

适合自学、转岗、业务开发、工具开发和希望尽快写出可维护 C++ 的学习者。

通用核心
  -> RAII / 智能指针
  -> nullptr / 初始化 / 新遍历方法 / auto / lambda
  -> 右值引用 / 移动语义 / optional / constexpr 基础
  -> 标准库容器与算法组合使用
  -> 模板基础
  -> 工程文件 / CMake / 简单项目
  -> 并发和工程实践

这条分支的重点是写出清楚、安全、可维护的 C++。指针、C 风格数组、宏和底层细节已经在通用核心中建立基本理解,后续主要作为排查问题和理解机制的支撑。

深水区入口规则

cpp深水区 不放进新手必经顺序,但主路线中遇到下面情况要主动跳转:

遇到的问题主路线只讲到哪里深水区入口
指针、引用、对象释放后仍被访问会识别危险写法所有权模型未定义行为
构造、析构、拷贝、移动规则开始混在一起会写常见类和 RAII 类型cpp对象生命周期cpp特殊成员函数
想知道对象在内存里怎么排布会用 class、继承、多态cpp对象模型与内存布局cpp平凡对象
返回对象、传参和移动的性能问题会用按值返回和 std::movecppRVO与返回值优化cpp值类别
模板错误、约束、特化规则看不懂会写简单函数模板和类模板cpp模板偏特化cpp类型萃取cppSFINAE与约束
异常发生时资源和状态是否可靠会用异常和 RAIIcpp异常安全

规则很简单:学习路线负责“能写、会用、知道常见安全写法”;如果开始讨论对象模型、生命周期边界、值类别、ODR、异常安全等级或未定义行为,就进入深水区。

通用核心主链

1. 先能写出完整程序

目标:知道程序从哪里开始执行,能完成输入、处理、输出。

学习顺序:

  1. CandCpp基础数据变量
  2. CandCpp标准输入输出
  3. CandCpp运算符
  4. CandCpp流程控制
  5. CandCpp数组
  6. CandCpp函数

练习建议:

  • 写一个四则运算计算器。
  • 写一个成绩统计程序,输入多名学生成绩,输出最高分、最低分、平均分。
  • 写一个猜数字小游戏,练习循环和条件判断。

2. 理解必要的底层概念

目标:理解“变量在内存中是什么”“指针为什么危险又重要”。

学习顺序:

  1. CandCpp指针
  2. CandCpp指针进阶
  3. CandCppconst
  4. CandCpp数据变量进阶
  5. CandCpp枚举
  6. CandCpp结构体
  7. CandCpp预处理
  8. CandCPP文件操作
  9. CandCpp底层知识

练习建议:

  • 用指针交换两个变量的值。
  • 用数组和指针遍历字符串。
  • 画出函数调用时局部变量、指针、堆内存的关系图。

阶段项目

目标:把前面的变量、流程控制、函数、数组、指针、结构体和文件操作串起来,形成简单通用开发能力。

项目方向:

  • 学生信息管理:用结构体保存姓名、年龄、成绩,用枚举表示状态,把数据写入文件再读回。
  • 简单记账工具:输入多条记录,统计总收入、总支出和余额,并保存到文本文件。
  • 命令行通讯录:支持添加、查询、删除和保存联系人。

完成标准:

  • 能把数据拆成合适的类型和函数。
  • 能处理基本输入错误和文件打开失败。
  • 能写出清楚、可运行、容易修改的代码。

后续进入 C++ 编程方式

目标:从“能写 C 风格代码”过渡到“写得像 C++”。

通用核心后半段:

  1. cpp进阶
  2. cppOOP知识地图
  3. STL初识

分支 A:历史代码维护 / 学校课程加深

  1. C语言存储类型
  2. C语言MallocFree
  3. c语言常用库
  4. cppNewAndDelete操作符
  5. cpp深水区

分支 B:现代 C++ 开发加深

  1. 现代cpp
  2. RAII
  3. 智能指针
  4. nullptr
  5. 最佳初始化
  6. 新遍历方法
  7. auto
  8. lambda
  9. 右值引用
  10. 移动语义
  11. optional
  12. constexpr
  13. 函数后关键字
  14. cpp模板编程知识地图
  15. cpp工程文件案例
  16. cpp多线程知识地图

学习重点:

  • C++ 不只是“带类的 C”,核心是对象生命周期、资源管理和抽象能力。
  • 能用 std::stringstd::vector、智能指针时,不要执着手写字符数组、裸数组和裸指针。
  • 模板阶段先学会简单函数模板、类模板和标准库泛型接口;模板元编程、SFINAE、复杂转发规则按需查阅。
  • 深水区不是额外主线;当问题从用法变成机制解释时,再进入 cpp深水区
  • 先写清楚、可运行、可维护的代码,再考虑性能优化。

Hello World

C 语言版本

#include <stdio.h>
 
int main(void)
{
    printf("Hello World\n");
    return 0;
}

C++ 版本

#include <iostream>
 
int main()
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

注意事项

  • main 是程序入口,推荐写成 int main()int main(void),不要写 void main()
  • C 使用 printf/scanf,C++ 使用 std::cout/std::cin。学习阶段可以都了解,但写 C++ 时优先使用 C++ 风格。
  • 初学阶段不要急着背所有语法,先用小程序把“变量、分支、循环、函数、数组、指针”串起来。

学习路径