应从“能跑通”入手而非学完语法,首日配置VS Code+CMake+GCC13,用-Wall -Wextra -std=c++20编译,第1–10天对比C风格指针与C++ STL实现,每日写50行有效代码并周末交付小项目。

从“能跑通”开始,而不是从“学完语法”开始
很多人卡在入门第一周,不是因为C++难,而是因为环境没搭对、编译报错看不懂、main函数写完却连hello world都跑不起来。真实路径是:先让代码动起来,再倒推为什么能动。
- 第一天就装好
VS Code + CMake + GCC 13(别用Visual Studio全家桶,它会掩盖很多底层问题) - 所有练习必须加编译参数:
-Wall -Wextra -std=c++20,把警告当错误改——比如unused variable或implicit conversion,这些不是小事,是未来段错误的伏笔 - 第1–10天只做一件事:用纯C风格写指针操作(如手动实现
strcpy、strlen),再立刻用C++重写一遍,对比std::string怎么帮你绕过边界越界 - 每天至少写50行有效代码,周末必须交付一个可运行的小东西:比如通讯录,支持增删查+保存到
contacts.txt,哪怕只有100行,也比抄1000行“完美示例”强
STL不是“库”,是设计决策的反馈器
很多人学完vector和map还是不会选——不是记不住接口,是不知道“为什么这里该用unordered_map而不是set”。真正的突破点在于:用STL倒逼你重新思考数据组织逻辑。
- 重写第一阶段的通讯录:把姓名→信息从
vector改成map,立刻体会find("张三")和for_each遍历的性能差异 - 动手删掉所有裸
new/delete,换成unique_ptr,然后故意在析构函数里打cout ,观察对象生命周期是否符合预期 - 调试时别怕进STL源码:用
gdb下断点后,输入p vec.size()或p *it看迭代器指向,比背文档管用十倍 - 警惕
vector::erase后迭代器失效——这是90%的“程序突然崩溃”的源头之一,宁可用remove_if + erase惯用法
别等“学完再项目”,项目就是你的语法书
所谓“精通”,不是知道所有C++20特性,而是面对一个真实需求(比如解析日志文件并统计IP频次),你能快速判断:用std::regex还是string_view切分?用std::jthread还是std::async并发读?这种判断力只来自反复踩坑。
- 第二个月结束前,必须完成一个带I/O和简单算法的项目:文本词频统计工具,要求支持命令行参数
-i input.log -o result.json,输出按频次降序,用std::sort+ lambda实现 - 第三个月起,锁定一个方向深挖:想走服务端,就用
Boost.Beast写个HTTP接收器,不用框架,只处理POST /log并写入本地文件;想走客户端,就用Qt搭界面,加QSqlDatabase存数据,别追求美观,重点练QObject内存管理 - 每次提交GitHub前,必须写
README.md:说明“我用了什么技术”“为什么选它”“遇到的最大问题是什么”,这比代码本身更能暴露认知盲区
现代C++特性不是炫技,是堵内存漏洞的补丁
auto、lambda、structured binding这些不是“新语法糖”,而是C++11之后为解决C++98遗留问题而生的防御性机制。忽略它们,等于主动放弃编译器给你的安全网。
立即学习“C++免费学习笔记(深入)”;
-
auto不是为了少打字,是避免int和size_t混用导致的隐式截断——比如for (int i = 0; i 在vec.size() > INT_MAX时直接UB -
lambda捕获列表必须显式写[&]或[=],别用默认捕获;[&x]比[&]更安全,因为你能一眼看出谁被引用了 - 用
std::optional替代nullptr或-1表示“无值”,尤其在配置解析、网络响应解析场景中,避免后续一堆if (val != -1)判空 - 一旦用上
std::shared_ptr,立刻检查循环引用:两个shared_ptr互相持有对方,资源永远不会释放——这时候就得上std::weak_ptr
vector的三指针、string的短字符串优化位、unique_ptr的控制块位置——这些地方,才是C++和别的语言拉开差距的起点。










