【C++ 笔记】从 C 到 C++:核心过渡

从 C 到 C++:核心过渡笔记(适合有 C 基础、刚开始系统学习 C++ 的人)

这是一份高度浓缩的“从 C 思维切换到 C++ 思维”的对比式笔记,重点放在最重要、最容易混淆、最影响后续学习的差异上。

1. 必须先转变的五大核心思维

排名C 思维(常见写法)C++ 推荐思维(现代写法)为什么重要(一句话)
1用 malloc / free 手动管理内存优先使用 RAII 类(vector、string、unique_ptr 等)90% 的内存泄漏和野指针问题直接消失
2用 struct + 函数指针模拟对象直接写 class / struct + 成员函数代码可读性、封装性、维护性指数级提升
3用 char* / char 数组处理字符串默认用 std::string安全性、便利性、性能综合碾压
4函数返回值表示成功/失败 + 输出参数传结果用异常 / std::optional / std::expected(C++23)接口更清晰,调用方代码更简洁
5全局变量、宏定义到处飞尽可能用 const / constexpr / 命名空间 / enum class可维护性、可测试性、模块化能力大幅提高

2. 最常出错的 12 个过渡陷阱(带正确写法)

序号C 风格写法(容易出错)C++ 现代写法(强烈推荐)关键差异说明
1char buf[256]; scanf("%s", buf);std::string s; std::cin >> s;std::getline(std::cin, s);缓冲区溢出风险彻底消失
2char* p = (char*)malloc(n); ... free(p);std::vector<char> v(n);std::unique_ptr<char[]> p(new char[n]);自动析构、边界检查、类型安全
3struct Node { int val; struct Node* next; };struct Node { int val; Node* next = nullptr; };默认初始化 + 成员初始化列表更安全
4#define MAX(a,b) ((a)>(b)?(a):(b))inline auto max(auto a, auto b) { return a>b?a:b; }std::max类型安全、调试容易、可打断点
5int cmp(const void* a, const void* b)bool cmp(const Type& a, const Type& b) 或 lambda可读性、类型安全、泛型能力
6typedef struct { ... } Stu;using Stu = struct { ... }; 或直接 struct Stu { ... };C++ 中 struct 已经是完整类型名
7FILE* fp = fopen(...); if(!fp) ... fclose(fp);std::ifstream ifs(filename); if(!ifs) ...RAII 自动关闭、异常安全
8void swap(int* a, int* b)void swap(int& a, int& b)std::swap更直观,不用取地址
9int* arr = (int*)malloc(sizeof(int)*n);std::vector<int> arr(n);std::unique_ptr<int[]> arr(new int[n]);长度自带、边界安全、自动释放
10enum Color { RED, GREEN, BLUE };enum class Color { Red, Green, Blue };强类型枚举,不会隐式转换到 int
11全局变量 int g_count;命名空间内 static 变量 或 函数内 static降低全局污染、更好的封装
12void* memmove(void* dest, const void* src, size_t n)std::copy / std::move / 容器算法类型安全、表达力更强

3. 过渡期推荐的“写代码三原则”(强烈建议贴屏幕上)

  1. 能用 std 容器就别自己写链表/数组/字符串
    vector / string / unordered_map / set 是前三年最该熟练的四个家伙
  2. 能用引用就别用指针,能用 const 引用就别用值传递
   void print(const std::string& s);     // 好
   void print(std::string s);            // 不好(拷贝)
   void print(const char* s);            // 能避免就避免
  1. 能用 RAII 管理资源就别手写配对的 new/delete、malloc/free、fopen/fclose
   std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(...), fclose);
   // 或更简单:
   std::ifstream ifs("data.txt");

4. 推荐的学习路径(0→能写现代 C++)

阶段时间建议核心任务推荐练习题/项目
阶段11–2 周熟练 vector / string / cin/cout / 范围for字符串处理、简单OJ题(读入→处理→输出)
阶段22–3 周理解 RAII、智能指针、const & constexpr用 unique_ptr / shared_ptr 重写链表、树
阶段33–4 周函数重载、引用、默认参数、类初步实现简易 vector / string / stack / queue
阶段4持续进行模板 + STL 常用算法 + lambda用 STL 解决 100 道经典算法题

5. 一张“速查表”:C → C++ 常见替换对照

C 写法C++ 推荐写法备注
char buf[1024];std::string buf;长度自适应
strcpy / strcat / strcmp= += ==更安全、更简洁
malloc(n * sizeof(T))std::vector<T> v(n);首选
(T*)malloc(sizeof(T))std::make_unique<T>()std::unique_ptr<T>(new T)智能指针
struct + 函数指针class / struct + 成员函数面向对象基础
#define 常量constexprconst编译期检查
enumenum class强类型
void*模板 或 std::any / std::variant类型安全

祝你从 C 顺利过渡到现代 C++!

有哪一部分你希望我再展开详细代码示例?
(比如:用 RAII 风格重写链表、智能指针实现简易 unique_ptr、string 的几种常见陷阱等)

文章已创建 4893

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部