C/C++速通Java?JS?Rust?

🚀 编程语言速通指南: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::stringString / StringBuilder⚠️ Java String 不可变!频繁拼接必须用 StringBuilder
std::mapHashMap / TreeMapHashMap 无序,TreeMap 有序(红黑树)
std::stackDeque (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)

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)

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)

// 对象字面量,不需要类
const me = { name: "Alice" };

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

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

4. Rust (Ownership)

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 写出来,说明你对内存掌控已经无敌了)。