C++和C的区别

embedded/2025/3/16 11:35:09/

C++和C语言虽然共享相似的语法,但在设计理念和功能特性上有显著区别。以下是两者的主要差异:

1. 编程范式

  • C:纯过程式编程,强调函数和步骤。
  • C++:支持多范式,包括面向对象编程(类、继承、多态)、泛型编程(模板)和过程式编程。

2. 面向对象特性

  • C++ 提供类(class)、对象、封装、继承(单继承、多继承)、多态(虚函数)等特性。
  • C 无原生面向对象支持,需通过结构体和函数指针模拟。

3. 标准库

  • C++ 拥有丰富的 STL(标准模板库),提供容器(如vectormap)、算法(如排序、查找)和迭代器等。
  • C 的标准库较小,主要提供基础功能(如stdio.hstdlib.h)。

4. 函数特性

  • 函数重载:C++允许同名函数通过参数列表区分,C不支持。
  • 默认参数:C++支持函数参数的默认值,C需显式传递所有参数。
  • 内联函数:C++通过inline关键字优化性能,C99虽引入但使用有限。

5. 内存管理

  • C++ 使用 new/delete 运算符,自动调用构造函数/析构函数。
  • C 使用 malloc()/free(),仅分配/释放内存,无构造/析构逻辑。
  • C++ 还支持智能指针(如unique_ptrshared_ptr),减少内存泄漏风险。

6. 类型安全

  • C++ 更严格:
    • void* 需显式转换(如 int* p = static_cast<int*>(malloc(...)))。
    • 输入输出(cin/cout)类型安全,C的printf/scanf易因格式字符串出错。

7. 引用与指针

  • C++ 支持 引用(变量别名,不可空),用于函数参数传递(如 void swap(int &a, int &b))。
  • C 仅支持指针,需显式传递地址(如 void swap(int *a, int *b))。

8. 异常处理

  • C++ 提供 try/catch/throw 机制。
  • C 依赖返回值或全局变量(如 errno)处理错误。

9. 命名空间

  • C++ 使用 namespace 避免命名冲突(如 std::vector)。
  • C 通过前缀命名(如 mylib_function())。

10. 运算符重载

  • C++ 允许自定义运算符行为(如为类定义 + 操作)。
  • C 运算符仅适用于内置类型。

11. 模板与泛型编程

  • C++ 支持模板(如 template <typename T>),实现类型无关的通用代码。
  • C 通过宏或void*模拟泛型,但类型安全性差。

12. 结构体与类

  • C++structclass 均可包含成员函数,区别仅在于默认访问权限(structpublicclassprivate)。
  • Cstruct 仅能包含数据成员。

13. 现代特性

  • C++11+ 引入自动类型推导(auto)、范围for循环、lambda表达式、移动语义等。
  • C 的现代标准(如C11)支持有限新特性(如泛型宏),但远不及C++丰富。

示例对比

函数重载(C++允许,C不允许):
// C++
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
// C 错误:重复定义
int add(int a, int b);
double add(double a, double b); 
动态内存管理:
// C++
int* arr = new int[10];
delete[] arr;
// C
int* arr = malloc(10 * sizeof(int));
free(arr);
输入输出:
// C++
#include <iostream>
std::cout << "Value: " << x << std::endl;
// C
#include <stdio.h>
printf("Value: %d\n", x);

总结

  • C 适合底层开发(如操作系统、嵌入式),强调效率和直接硬件控制。
  • C++ 在兼容C的基础上,提供高级抽象(如面向对象、泛型编程),适用于大型软件、游戏引擎、高性能应用等场景。

http://www.ppmy.cn/embedded/173052.html

相关文章

linux Swap 分区

Swap 分区在 Linux 系统中的作用 Swap 分区&#xff08;交换分区&#xff09;相当于虚拟内存&#xff0c;在物理内存&#xff08;RAM&#xff09;不够用时&#xff0c;系统会将一部分磁盘空间作为虚拟内存使用。主要作用如下&#xff1a; 缓解内存不足&#xff1a;当物理内存…

内网渗透之内网基础知识(一)

工作组 工作组:工作组是局域网中的一个概念&#xff0c;他是长久的资源管理模式。默认情况下使 用工作组方式进行资源管理&#xff0c;将不同的 computer 按照不同的要求分类到不同的组 域:用来描述一种架构&#xff0c;和“工作组”相对应&#xff0c;由工作组升级而来的高级…

Winfrom基础知识41-60

41. 如何实现自定义控件的复杂绘制&#xff1f; 答案&#xff1a; 继承 Control 类并重写 OnPaint 方法&#xff0c;使用 Graphics 对象进行复杂绘制。 示例&#xff1a; public class CustomGraph : Control {protected override void OnPaint(PaintEventArgs e){base.OnPa…

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…

docker指令整理

以下是 Docker 常用指令的归纳整理&#xff0c;涵盖镜像管理、容器操作、网络配置、数据卷等核心场景&#xff0c;方便快速查阅&#xff1a; 一、镜像管理 命令说明示例docker pull拉取镜像docker pull nginx:latestdocker push推送镜像到仓库docker push my-registry.com/my-…

C++:二分习题

1. 借教室 503. 借教室 - AcWing题库 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。 教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。  面对海…

OpenHarmony 5.0 MP4封装的H265视频播放失败的解决方案

问题现象 OpenHarmony 5.0版本使用AVPlayer播放MP4封装格式的H.265(HEVC)编码格式的视频时解码失败导致播放失败 问题原因 OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎&#xff0c;因为 libav_codec_hevc_parser.z.so 动态库未开源导致从MP4封装中分离的HVCC格式的…

CVPR-2025 | 长程视觉语言导航平台与数据集:迈向复杂环境中的智能机器人

作者&#xff1a;Xinshuai Song, Weixing Chen, Yang Liu, Weikai Chen, Guanbin Li, Liang Lin 单位&#xff1a;中山大学&#xff0c;Independent Researcher&#xff0c;鹏城实验室 项目主页&#xff1a;https://hcplab-sysu.github.io/LH-VLN 论文地址&#xff1a;https…