🚀 编程语言速通指南: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 里看到满屏幕的 Promiseasyncawait。这是 Web 开发的基石。

类型系统的放飞自我

  • "1" + 1 结果是 "11" (字符串拼接)。
  • "1" - 1 结果是 0 (数字减法)。
  • 🛡️ 防御手段:永远使用 const (不可变变量) 和 let,绝对不要用 var。比较相等永远用 === (三等号),绝对不要用 ==

原型链 (Prototype)

  • JS 的 class 只是语法糖。本质上它是通过“克隆”一个对象并建立链接来实现继承的。

2. 学习策略

  1. DOM 操作:学会 document.querySelector 怎么抓元素。
  2. 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 的所有权机制会让双向链表极其难写(需要 UnsafeRc<RefCell<>>),这会打击咱的自信心。先用 Rust 写写算法题、命令行工具(交叉编译玩板子也好)。

⚔️ 第五章:实战演练 —— 茴字的四种写法

任务:创建一个对象,打印,然后传递给函数。

1. C++ (Standard)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
struct Person { string name; };

void printPerson(Person p)  // ⚠️ 发生拷贝!(除非加 &)
{
    cout << p.name << endl;
}

int main()
{
    Person me = {"Alice"};
    printPerson(me);  // me 依然有效,只是被拷贝了一份
    return 0;
}

2. Java (Reference)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Person { String name; }

// 必须在 class 里
class Main
{
    static void printPerson(Person p)  // ⚠️ 传的是引用的副本(指针)
    {
        System.out.println(p.name);
    }
    public static void main(String[] args) {
        Person me = new Person();
        me.name = "Alice";
        printPerson(me); // me 依然有效,指向同一个对象
    }
}

3. JavaScript (Dynamic)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 对象字面量,不需要类
const me = { name: "Alice" };

function printPerson(p)
{
    console.log(p.name);
}

printPerson(me); // 传引用
// ⚠️ 甚至可以动态加属性: me.age = 18;

4. Rust (Ownership)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
struct Person { name: String }

fn print_person(p: Person)
{ // ⚠️ 所有权发生转移 (Move)!
    println!("{}", p.name);
} // p 在这里被 drop (析构)

fn main()
{
    let me = Person { name: String::from("Alice") };
    print_person(me); 
    // println!("{}", me.name); // ❌ 报错!me 已经不能用了!
}

🎓 第六章:好的规划 (速通路线)

依旧,不要试图平均用力。精力有限。

  • C++ (主力 - 60% 精力)

    • 目标:理解指针、内存、栈与堆。刷 LeetCode 主力语言。
    • 收益:打下坚实的计算机科学基础。
  • Java & Web (技多不压身嘛 - 10% 精力)

    • 目标:面向绩点编程。
      • Java: 掌握 Class/Interface/Polymorphism (多态) 即可。
      • Web: 掌握 HTML结构 + CSS布局 + JS基础交互。
    • 心态:应付得当。
  • Rust (⚪神启动 - 30% 精力)

    • 目标:面向未来编程。
    • 做法:当你觉得 C++ 的指针让你头疼,或者 Segment Fault 让你崩溃时,去学 Rust。
    • 收益:学会 Rust 会反过来让你成为一个更好的 C++ 程序员(你会下意识地写出更安全的代码)。

📝 最后

  • LeetCode 多语言刷题:这是一个极好的习惯。建议顺序:先写 C++ 版(想算法),再写 Java/JS 版(练 API),最后尝试 Rust 版(如果你能用 Rust 写出来,说明你对内存掌控已经无敌了)。