Prompt
[IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]
首先运行进度追踪脚本:
`bash
bash /home/ubuntu/.cpp_teach_progress.sh
cat /tmp/cpp_teach_progress.txt
`
然后从输出中读取 NEXT_INDEX 的值,根据该编号选择对应的知识点进行精讲。
知识点编号对照表:
【基础认知】
- 编译链接全流程
- cout/cin与缓冲机制
- 变量生命周期与作用域
【数值与运算】
- 整型溢出与浮点精度丢失
- 自增/自减(前缀后缀区别)
- 逻辑短路与位运算初探
【控制流】
- switch穿透与if-else阶梯
- 三种循环(for/while/do-while)适用场景
【函数精髓】
- 值传递/引用传递/地址传递
- 函数重载的二义性
- 内联函数替代宏的优劣势
【const宇宙】
- const修饰变量/指针/引用
- const成员函数与mutable
【内存与指针】
- 野指针与空指针(nullptr)
- 数组名退化为指针
- new/delete与malloc/free区别
- 内存泄漏与智能指针雏形(unique_ptr)
【类与封装】
- 空类大小与内存对齐
- 构造函数重载与委托构造
- 初始化列表(必须使用的场景)
- 深拷贝与浅拷贝(拷贝构造)
- static成员与静态函数
【继承多态】
- 继承权限(public/protected/private)
- 构造/析构调用顺序
- 虚函数表指针(vptr)与多态原理
- 纯虚函数与抽象接口类
- 友元类与友元函数
【STL初探】
- string的c_str()陷阱与find方法
- vector扩容机制(size/capacity)
- 迭代器类型与失效场景
- 范围for循环的底层本质
【现代C++特性】
- auto类型推导与decltype
- nullptr替代NULL的底层原因
- 右值引用与移动语义(入门级)
- Lambda表达式基本捕获写法
输出格式(严格按此结构,总字数控制在1000字内,确保5分钟读完):
📘 今日课题:[知识点名称](难度:⭐ / ⭐⭐)
🤔 为什么需要它?
(用60字说明这个知识解决了什么编程痛点,不堆砌概念)
🏠 人间烟火类比
(用一个生活场景彻底讲透核心思想,30字左右)
🔍 核心代码剖析(约15~20行)
`cpp
// 带详细中文注释,展示最典型用法和反例
`
💡 关键提醒:(一句话点出最容易踩的坑)
注意:
- 绝对不要使用 Markdown 表格
- 使用 ## 作为二级标题
- 使用 文字 作为粗体
- 使用
`cpp 和`包裹代码块 - 使用 - 或 * 作为列表项
Response
NEXT_INDEX=1,对应知识点:编译链接全流程。
📘 今日课题:编译链接全流程(难度:⭐)
🤔 为什么需要它?
写代码时经常遇到"未定义引用"或"重复定义"错误,搞懂编译链接流程就能自己定位问题根源,而不是盲目百度。
人间烟火类比
把做菜比作战编译:食材是源码(.cpp),切菜是预处理,炒菜是编译成字节码(.o),最后摆盘上桌是链接把所有.o拼成可执行程序。
核心代码剖析
`cpp
// main.cpp —— 程序入口
#include <iostream> // 预处理阶段:把iostream内容直接粘贴到这里
using namespace std;
// 声明外部函数(告诉编译器:别处有这个函数)
int add(int a, int b);
int main() {
cout << add(3, 5) << endl; // 运行时才会去链接找add的实现
return 0;
}
`
`cpp
// math.cpp —— 另一个源文件,独立编译
int add(int a, int b) {
return a + b;
}
`
编译四步走:
`bash
1. 预处理:展开所有 #include 和 #define
g++ -E main.cpp -o main.i
2. 编译:检查语法,生成汇编
g++ -S main.i -o main.s
3. 汇编:生成目标文件 .o(机器码,但符号未解析)
g++ -c main.s -o main.o
4. 链接:把 main.o 和 math.o 拼在一起,解决符号引用
g++ main.o math.o -o program
一步到位写法
g++ main.cpp math.cpp -o program
`
常见坑——"未定义引用":
`cpp
// 只声明没定义,链接阶段报错
extern int x; // 声明了
// int x = 10; // 注释掉了定义
int main() { cout << x; } // ❌ undefined reference to `x'
`
常见坑——"重复定义":
`cpp
// 在头文件里写了定义而非声明
// header.h
int global = 42; // ❌ 每个#include它的cpp都会定义一份
// 正确做法:头文件只放声明
extern int global; // ✅ 告诉编译器:全局变量存在,链接时去找
`
💡 关键提醒:头文件里只能放声明(extern/函数原型),不能放定义(带初始化的变量或函数体),否则多文件编译时必然重复定义。
⏭️ 下次预告:cout/cin与缓冲机制(编号2)
📝 进度已更新,下次运行将自动进入下一课。