C++三个月可入门但需避开关键陷阱:必须用g++而非gcc链接C++标准库;优先用std::vector而非原始数组;std::string需用c_str()转C字符串;核心是养成RAII等现代C++习惯。

C++ 不适合“零基础快速入门”——它不是 Python,没有“写完就跑”的宽容性;但只要避开几个关键陷阱,三个月写出能编译、能调试、能读标准库代码的程序完全可行。
为什么 g++ 编译报错一堆 undefined reference to `std::...'
这是新手第一天最常卡住的问题:写了 #include <iostream>,用了 std::cout,却链接失败。根本原因不是头文件没包含,而是没用 C++ 链接器。
- 用
gcc hello.cpp会调 C 链接器,不拉 C++ 标准库(libstdc++),必然炸 - 必须用
g++ hello.cpp—— 它自动加-lstdc++和正确的启动文件 - 如果非要用
gcc,得手动补:gcc hello.cpp -lstdc++,但没必要,徒增混淆 - Windows 上用 MinGW 或 MSVC 时,同理:别用
cl却漏掉/EHsc(启用异常处理)或/std:c++17
std::vector 和原始数组怎么选?别一上来就手写 new int[10]
刚学循环和指针,容易把 C 风格数组当默认解法。但 C++ 里,95% 的场景该用 std::vector。
-
int arr[5]:大小固定、不带长度信息、传参退化为指针、越界完全不检查 -
std::vector<int> v = {1,2,3};:自动管理内存、v.size()可靠、支持范围 for、可 resize - 唯一该用原始数组的时候:嵌入式裸机、性能敏感且确定尺寸的栈缓冲(如
char buf[256]) - 千万别写
int* p = new int[10]; ... delete[] p;—— 没 RAII,一忘delete就泄漏;改用std::vector或std::array
为什么 std::string 比 char* 安全,但又不能随便传给 C 函数?
std::string 是值语义、自动管理、支持 + 拼接,比 C 字符串省心太多;但它内部存储不保证以 <p><code>std::string 是值语义、自动管理、支持 + 拼接,比 C 字符串省心太多;但它内部存储不保证以 \0 结尾(C++11 起保证),且数据可能不在连续内存块开头。
立即学习“C++免费学习笔记(深入)”;
- 要传给 C 函数(如
fopen、printf),必须显式取 C 风格指针:s.c_str()或s.data() -
s.c_str()保证返回以\0结尾的const char*;s.data()在 C++11 中不一定以\0结尾,慎用 - 别存
s.c_str()的结果到变量里再用:const char* p = s.c_str(); s += "x"; puts(p);——s变了,p可能悬空 - 读文件路径、命令行参数、网络响应等不确定长度的字符串,无条件用
std::string;只有对接 legacy C API 时才临时转
最难的不是语法,是习惯切换:C++ 不是“带类的 C”,它的资源管理模型(RAII)、类型系统(模板、引用)、标准库设计哲学(迭代器、算法分离)都得慢慢对齐。写完一段代码,先问自己一句:“这段如果抛异常,资源还安全吗?”——这个问题比“怎么写 for 循环”重要十倍。










