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::move | cppRVO与返回值优化、cpp值类别 |
| 模板错误、约束、特化规则看不懂 | 会写简单函数模板和类模板 | cpp模板偏特化、cpp类型萃取、cppSFINAE与约束 |
| 异常发生时资源和状态是否可靠 | 会用异常和 RAII | cpp异常安全 |
规则很简单:学习路线负责“能写、会用、知道常见安全写法”;如果开始讨论对象模型、生命周期边界、值类别、ODR、异常安全等级或未定义行为,就进入深水区。
通用核心主链
1. 先能写出完整程序
目标:知道程序从哪里开始执行,能完成输入、处理、输出。
学习顺序:
练习建议:
- 写一个四则运算计算器。
- 写一个成绩统计程序,输入多名学生成绩,输出最高分、最低分、平均分。
- 写一个猜数字小游戏,练习循环和条件判断。
2. 理解必要的底层概念
目标:理解“变量在内存中是什么”“指针为什么危险又重要”。
学习顺序:
- CandCpp指针
- CandCpp指针进阶
- CandCppconst
- CandCpp数据变量进阶
- CandCpp枚举
- CandCpp结构体
- CandCpp预处理
- CandCPP文件操作
- CandCpp底层知识
练习建议:
- 用指针交换两个变量的值。
- 用数组和指针遍历字符串。
- 画出函数调用时局部变量、指针、堆内存的关系图。
阶段项目
目标:把前面的变量、流程控制、函数、数组、指针、结构体和文件操作串起来,形成简单通用开发能力。
项目方向:
- 学生信息管理:用结构体保存姓名、年龄、成绩,用枚举表示状态,把数据写入文件再读回。
- 简单记账工具:输入多条记录,统计总收入、总支出和余额,并保存到文本文件。
- 命令行通讯录:支持添加、查询、删除和保存联系人。
完成标准:
- 能把数据拆成合适的类型和函数。
- 能处理基本输入错误和文件打开失败。
- 能写出清楚、可运行、容易修改的代码。
后续进入 C++ 编程方式
目标:从“能写 C 风格代码”过渡到“写得像 C++”。
通用核心后半段:
分支 A:历史代码维护 / 学校课程加深
分支 B:现代 C++ 开发加深
- 现代cpp
- RAII
- 智能指针
- nullptr
- 最佳初始化
- 新遍历方法
- auto
- lambda
- 右值引用
- 移动语义
- optional
- constexpr
- 函数后关键字
- cpp模板编程知识地图
- cpp工程文件案例
- cpp多线程知识地图
学习重点:
- C++ 不只是“带类的 C”,核心是对象生命周期、资源管理和抽象能力。
- 能用
std::string、std::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++ 风格。 - 初学阶段不要急着背所有语法,先用小程序把“变量、分支、循环、函数、数组、指针”串起来。
学习路径
- 上一节:无
- 当前阶段:总入口
- 下一节:CandCpp基础数据变量