🚀 编程语言速通指南:C/C++ 选手的多宇宙生存手册
适用人群:已掌握 C,进修 C++ 辅修 Py,被迫学 Java/JS,想搞 Rust 的大一/大二学生。
核心心法:语言只是工具,设计哲学才是灵魂。不要背语法,要懂“为什么这么设计”。
🗺️ 第一章:总览 —— 四角恋
在开始具体语言之前,先建立坐标系。
| 特性维度 | 🛡️ C++ (主修) | ☕ Java (学校的作业) | 🌐 JavaScript (Web必修) | 🦀 Rust (加入蟹教!) |
|---|---|---|---|---|
| 内存管理 | 手动/RAII (自由但危险) |
GC 垃圾回收 (省心但不可控) |
GC 垃圾回收 (完全黑盒) |
所有权 (Ownership) (编译期强制管理) |
| 类型系统 | 静态强类型 (但也允许指针瞎转) |
静态强类型 (泛型是擦除法做的) |
动态弱类型 (变量类型随时变) |
静态极强类型 (几乎零隐式转换) |
| 核心哲学 | 零开销抽象 (相信程序员) |
工程安全性 (防住菜鸟程序员) |
灵活与交互 (先跑起来再说) |
安全与性能并存 (编译器是你爹) |
| 运行机制 | 编译 -> 机器码 | 编译 -> 字节码 -> JVM | 源码 -> V8引擎 -> 解释/JIT | 编译 -> 机器码 (LLVM) |
☕ 第二章:Java —— “被阉割且穿上防弹衣的 C++”
💡 速通注解:把 Java 当作一个没有指针、强制面向对象、自带内存管家的 C++ 子集。
1. 核心差异(必须扭转的 C++ 习惯)
一切皆引用(除了基本类型):
- C++:
Student a = b;(默认是值拷贝,a 和 b 是两块内存)。 - Java:
Student a = b;(永远是指针拷贝,a 和 b 指向同一个对象)。
⚠️ 警告:在 LeetCode 里做回溯算法(Backtracking)时,往结果集里添加 List 时,必须 new ArrayList<>(currentList),否则你最后存的全是同一个空列表的引用。
没有析构函数 (Destructor):
- C++:
}结束,栈对象自动销毁,释放资源(RAII)。 - Java: 对象活着,内存由 GC 回收。文件/数据库连接必须用
try-with-resources显式关闭。
真·面向对象:
- 没有全局函数,连
main都要包在class里。 - 没有头文件,只有
import。
2. LeetCode 刷题映射表
| C++ (STL) | Java (Collection Framework) | 备注 |
|---|---|---|
std::vector<int> |
ArrayList<Integer> |
Java 泛型不能存 int,只能存包装类 Integer |
std::string |
String / StringBuilder |
⚠️ Java String 不可变!频繁拼接必须用 StringBuilder |
std::map |
HashMap / TreeMap |
HashMap 无序,TreeMap 有序(红黑树) |
std::stack |
Deque (ArrayDeque) |
Java 的 Stack 类太老了,官方推荐用 Deque 替代 |
pair<int,int> |
int[] 或 自定义类 |
Java 原生没有 Pair,通常用长度为2的数组代替 |
🌐 第三章:JavaScript —— “披着 C 外衣的 Lisp”
💡 速通注解:千万别被它的花括号骗了,它和 C/Java 只有长得像。它的灵魂是 异步 和 函数式。
1. 核心差异(最容易翻车的坑)
单线程与事件循环 (Event Loop):
- 概念: C++ 睡觉(
sleep)会卡死线程。JS 绝不允许卡死主线程(因为主线程要渲染网页)。 - 机制: 耗时任务(网络、定时器)会被扔给浏览器,完成后把回调函数扔进任务队列。
- ⚠️ 重点:这就是为什么你会在 JS 里看到满屏幕的
Promise、async、await。这是 Web 开发的基石。
类型系统的放飞自我:
"1" + 1结果是"11"(字符串拼接)。"1" - 1结果是0(数字减法)。- 🛡️ 防御手段:永远使用
const(不可变变量) 和let,绝对不要用var。比较相等永远用===(三等号),绝对不要用==。
原型链 (Prototype):
- JS 的
class只是语法糖。本质上它是通过“克隆”一个对象并建立链接来实现继承的。
2. 学习策略
- DOM 操作:学会
document.querySelector怎么抓元素。 - Fetch API:学会怎么发网络请求(这就不仅是语言了,涉及 HTTP 协议)。
🦀 第四章:Rust —— “为了解决 C++ 膈应人而生!”
💡 速通注解:孩子喜欢 Rust 是对的()。它是未来的系统级语言。用 Rust 可以更好的提升 C++ 能力。
1. 核心差异
所有权 (Ownership) vs 拷贝 (Copy):
- C++:
auto a = vector_data;(隐式深拷贝/拷贝构造,开销大)。 - Rust:
let a = vector_data;(默认是 Move 移动)。旧变量vector_data直接失效!编译器禁止你再访问它。 - 目的: 彻底杜绝 Double Free(重复释放)和 Use After Free(释放后使用)。
借用检查 (Borrow Checker) —— 你的新“敌人”:
- 规则:同一时间,数据的引用,要么只能有一个可写的,要么可以有无数个只读的。绝不共存。
- C++: 允许你在遍历
vector的同时修改它(然后导致迭代器失效,程序崩溃)。 - Rust: 编译时直接报错,逼你修改逻辑。
没有继承,只有组合:
- Rust 抛弃了复杂的
class继承树,改用Trait(类似接口) 和Struct组合。这符合“多用组合,少用继承”的现代设计原则。
2. 避坑指南(针对初学者)
不要用 Rust 写链表! (至少一开始不要qwq)。Rust 的所有权机制会让双向链表极其难写(需要 Unsafe 或 Rc<RefCell<>>),这会打击咱的自信心。先用 Rust 写写算法题、命令行工具(交叉编译玩板子也好)。
⚔️ 第五章:实战演练 —— 茴字的四种写法
任务:创建一个对象,打印,然后传递给函数。
1. C++ (Standard)
|
|
2. Java (Reference)
|
|
3. JavaScript (Dynamic)
|
|
4. Rust (Ownership)
|
|
🎓 第六章:好的规划 (速通路线)
依旧,不要试图平均用力。精力有限。
-
C++ (主力 - 60% 精力)
- 目标:理解指针、内存、栈与堆。刷 LeetCode 主力语言。
- 收益:打下坚实的计算机科学基础。
-
Java & Web (技多不压身嘛 - 10% 精力)
- 目标:面向绩点编程。
- Java: 掌握
Class/Interface/Polymorphism(多态) 即可。 - Web: 掌握 HTML结构 + CSS布局 + JS基础交互。
- Java: 掌握
- 心态:应付得当。
- 目标:面向绩点编程。
-
Rust (⚪神启动 - 30% 精力)
- 目标:面向未来编程。
- 做法:当你觉得 C++ 的指针让你头疼,或者 Segment Fault 让你崩溃时,去学 Rust。
- 收益:学会 Rust 会反过来让你成为一个更好的 C++ 程序员(你会下意识地写出更安全的代码)。
📝 最后
- LeetCode 多语言刷题:这是一个极好的习惯。建议顺序:先写 C++ 版(想算法),再写 Java/JS 版(练 API),最后尝试 Rust 版(如果你能用 Rust 写出来,说明你对内存掌控已经无敌了)。