当前位置:首页>java>用 “做菜” 讲明白:C 与 C++ 编程差异在哪?

用 “做菜” 讲明白:C 与 C++ 编程差异在哪?

  • 2026-08-23 18:17:07
用 “做菜” 讲明白:C 与 C++ 编程差异在哪?
大家好,我是小栈!
很多童鞋学完 C 再上手 C++,总觉得只是多了类、继承、虚函数这些语法,照着写却总写不出 “地道” 的 C++代码,甚至还在用 C 的思路写 C++ 程序 —— 这不是语法没学透,而是没搞懂两者编程思想的核心差异!
01 编程思想
一句话:C语言是面向过程的“执行者”,C++是面向对象的“设计者”。

所谓面向过程,以“函数/过程”为核心(函数驱动),按照函数调用顺序执行,按步骤实现功能。该思想关注的是“怎么做”。

所谓面向对象,以“对象”为核心(对象驱动),将不同的方法封装在在不同的类中,根据具体目的来调用相应的对象去实现。该思想关注的是“谁来做”。

我们来看一个通俗的例子,做一道菜:

1)面向过程思想:

按步骤执行 1.买菜 -> 2.洗菜 -> 3.切菜 -> 4. 炒菜 - > 5.装盘。

2)面向对象思想:

对象是 厨师(负责 炒菜),帮厨(负责 买菜、洗菜、切菜、装盘等),食材(包括 白菜、猪肉、鱼肉),炒锅(煮菜工具)。

这些对象各司其职,而非按步骤顺序进行。

大家是不是有直观的体会了?

02 代码比较

理解了编程思想,我们从代码层面进行解读。这里以学生成绩管理功能为例:

1)C语言(面向过程)

#include<iostream>#include<string>using namespace std;// 定义数据结构:存储学生信息(仅数据,无行为)struct Student {    string name;   // 姓名    int id;        // 学号    int scores[3]; // 3门课成绩};// 函数1:计算总分(操作外部的Student数据)intcalculateTotalScore(const Student& stu){    int total = 0;    for (int score : stu.scores) {        total += score;    }    return total;}// 函数2:打印学生信息(操作外部的Student数据)voidprintStudentInfo(const Student& stu){    int total = calculateTotalScore(stu);    cout << "学号:" << stu.id << endl;    cout << "姓名:" << stu.name << endl;    cout << "总分:" << total << endl;}intmain(){    // 步骤1:定义数据    Student stu;    stu.name = "zgh";    stu.id = 2025001;    stu.scores[0] = 85;    stu.scores[1] = 90;    stu.scores[2] = 78;    // 步骤2:按顺序调用函数(过程化执行)    printStudentInfo(stu);    return 0;}

从上述C代码中可以看出:数据与操作数据的函数相互隔离,顺序执行

  • 数据(Student结构体)与操作数据的函数(calculateTotalScore/printStudentInfo)分离;
  • 主函数按“数据定义 ->函数调用”的步骤顺序执行,核心是过程化;
  • 若需要扩展功能(如修改成绩),需新增函数,维护成本较高。
2)C++(面向对象)
#include <iostream>#include <string>using namespace std;// 定义类:封装学生的属性和方法class Student {private:    // 私有属性:仅类内部可访问(封装性)    string name;    int id;    int scores[3];public:    // 构造函数:初始化对象属性    Student(string n, int i, int s1, int s2, int s3) {        name = n;        id = i;        scores[0] = s1;        scores[1] = s2;        scores[2] = s3;    }    // 方法1:计算总分(类内部方法,访问私有属性)    intcalculateTotalScore() const {        int total = 0;        for (int score : scores) {            total += score;        }        return total;    }    // 方法2:打印信息(类内部方法)    voidprintInfo() const {        int total = calculateTotalScore();        cout << "学号:" << id << endl;        cout << "姓名:" << name << endl;        cout << "总分:" << total << endl;    }    // 可选:提供接口修改属性(封装的扩展,避免直接操作私有数据)    voidsetScore(int index, int newScore) {        if (index >= 0 && index < 3) {            scores[index] = newScore;        }    }};intmain() {    // 创建对象:通过类实例化,属性通过构造函数初始化    Student stu("zgh", 2025001, 85, 90, 78);    // 调用对象的方法:对象自主完成行为(“谁来做”)    stu.printInfo();    // 扩展:修改成绩(通过类提供的接口,保证数据安全)    stu.setScore(2, 88);    cout << "\n修改第3门成绩后:" << endl;    stu.printInfo();    return 0;}

从上述C++代码中可以看出:将数据与行为封装为一个类,绑定在一起

  • 数据(name、score、id)私有化,避免被外部非法纂改;

  • 数据与行为(计算、打印成绩等)绑定在一个类中,封装化;

  • 新增功能只需在类内新增方法,不影响外部代码。

03 不同适用场景

1)C语言(面向过程编程)适用于嵌入式开发、底层库开发、操作系统内核开发等。

场景
典型案例
理由
嵌入式开发
单片机程序、设备固件
1. 对内存占用、运行效率要求极致;
2. 直接操作寄存器、硬件接口,C 语法更简洁,无额外开销;
3. 嵌入式编译器对 C 的支持更完善
操作系统 
内核开发
Linux 内核、驱动程序
1. 内核层需要极致的性能和可控性,C++ 的虚函数、异常等会引入不可控的开销;
2. 内核代码追求简洁、可调试,C 的过程式风格更易维护。
高性能底层库
基础算法库、网络协议栈
1. 库需要被多语言调用,C 的 ABI(应用二进制接口)更稳定;
2. 无额外封装开销,调用效率最高。

2)C++(面向对象编程)适用于大型工程、需模块化的复杂系统、跨平台开发。

场景
典型案例
理由
大型工程 
复杂系统开发
游戏引擎、智能驾驶
1. 面向对象特性(封装 / 继承 / 多态)降低复杂系统的耦合度,便于团队协作和维护;
2. STL 提供丰富的容器(vector/map)和算法,提升开发效率。
高性能应用开发
图形渲染(OpenGL/DirectX)、高频交易系统
1. 保留 C 的高性能,同时用 OOP / 泛型编程简化代码;
2. 支持运算符重载、模板等特性,适合编写高效且易读的算法。
跨平台应用开发
Qt 框架开发的桌面软件、跨平台工具
Qt 基于 C++ 的面向对象特性,可快速封装跨平台接口,兼顾性能和开发效率。

写在最后

如果有童鞋想入门C++,可参考小栈之前的文章:别再怕 C++!入门其实很简单

你在从 C 转 C++ 的过程中,最头疼的思想卡点是什么?欢迎评论区滴滴!

最新文章

随机文章