三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

C语言与C++在基础语法上的区别

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数据)int calculateTotalScore(const Student& stu) { int total = 0; for (int score : stu.scores) { total += score; } return total;}

// 函数2:打印学生信息(操作外部的Student数据)void printStudentInfo(const Student& stu) { int total = calculateTotalScore(stu); cout << "学号:" << stu.id << endl; cout << "姓名:" << stu.name << endl; cout << "总分:" << total << endl;}

int main() { // 步骤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:计算总分(类内部方法,访问私有属性) int calculateTotalScore() const { int total = 0; for (int score : scores) { total += score; } return total; }

// 方法2:打印信息(类内部方法) void printInfo() const { int total = calculateTotalScore(); cout << "学号:" << id << endl; cout << "姓名:" << name << endl; cout << "总分:" << total << endl; }

// 可选:提供接口修改属性(封装的扩展,避免直接操作私有数据) void setScore(int index, int newScore) { if (index >= 0 && index < 3) { scores[index] = newScore; } }};

int main() { // 创建对象:通过类实例化,属性通过构造函数初始化 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++ 的面向对象特性,可快速封装跨平台接口,兼顾性能和开发效率。

← 返回列表