C++与C编程思想区别
前言:C语言是由Dennis Ritchie于20世纪70年代开发的一种通用编程语言,采用了向过程的编程思想。
C++语言是由Bjarne Stroustrup于20世纪80年代开发的一种更高级的编程语言,采用面向对象的编程思想。
目录
一、编程思想解析
所谓面向过程,以“函数/过程”为核心,按照函数调用顺序执行,按步骤实现功能。该思想关注的是“怎么做”。
所谓面向对象,以“对象”为核心,将不同的方法封装在在不同的类内,根据具体目的来调用相应的对象去实现。该思想关注的是“谁来做”。
类比一个实际例子:(做一道菜)
面向过程思想:按步骤 1.买菜 -> 2.洗菜 -> 3.切菜 -> 4. 炒菜 - > 5.装盘。
面向对象思想:对象是 厨师(炒菜),帮厨(买菜、洗菜、切菜、装盘),食材(白菜、猪肉、鱼肉),炒锅(煮菜工具),各司其职,而非按步骤顺序罗列。
二、代码例子对比
以学生成绩管理功能为例:
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;
}
数据(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;
}
- 数据(name、score、id)私有化,避免被外部非法纂改;
- 数据与行为(计算、打印成绩等)绑定在一个类中,对象化;
- 新增功能只需在类内新增方法,不影响外部代码。
三、适用场景
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++ 的面向对象特性,可快速封装跨平台接口,兼顾性能和开发效率。 |
四、总结
面向过程的核心是“函数驱动”,代码简洁易懂但扩展性差,适合简单任务。
面向对象的核心是“对象驱动”,通过封装、继承、多态思想实现,高复用,易扩展,适合复杂系统。
更多推荐



所有评论(0)