当前位置: 首页 > news >正文

c++和c的不同

c++:面向对象(封装,继承,多态),STL,模板

一、基础定义与背景

C语言

  • 诞生年代:20世纪70年代,Dennis Ritchie在贝尔实验室开发。
  • 主要特点
    • 过程式、结构化编程
    • 面向系统底层开发(操作系统、嵌入式系统)
    • 高效、灵活、接近硬件
    • 标准库较小,功能有限
  • 编程思想:强调“做什么”——步骤清晰,硬件级别操作

C++语言

  • 诞生年代:20世纪80年代初,由Bjarne Stroustrup在C基础上开发的
  • 主要特点
    • 在C基础添加了面向对象(OOP)支持
    • 引入泛型编程(模板)
    • 提供异常机制
    • 丰富的标准模板库(STL)
    • 多范式(面向对象、泛型、函数式、命令式)
  • 编程思想:更高级别的抽象(“做什么”与“怎么做”解耦)

二、从语法和特性上详细对比

类别C 语言特性C++ 语言新增特性说明
程序范式过程式支持过程式、面向对象、泛型、函数式多范式支持
数据抽象结构体(struct类(class)支持封装、隐藏可以定义私有成员、保护成员
继承与多态不支持支持(单继承、多继承、虚函数、多态)支持面向对象设计的多态性
函数特性普通函数支持函数重载、虚函数、纯虚函数、默认参数强大灵活,支持不同参数版本
模板机制不支持支持(函数模板、类模板)编写通用容器和算法,代码复用
异常处理不支持(错误码处理)支持(try-catch机制)提升程序的健壮性
命名空间不支持支持(namespace避免命名冲突,结构更清晰
标准库stdio.hstdlib.h 等引入<iostream><vector><map><algorithm>大幅度丰富,方便开发
内存管理主要用malloc()free()支持newdelete,以及智能指针(从C++11开始)提供更高效安全的内存管理
多重继承不支持支持实现复杂对象关系
数据封装与访问控制只能通过结构体成员访问支持privateprotectedpublic更好的数据隐藏和封装

三、设计思想与应用层面差异

  • 底层接近 vs 高层抽象

    • C偏底层,直接操作内存和硬件
    • C++强调抽象与重用,适合复杂系统开发
  • 开发效率

    • C代码写在硬件控制、驱动程序
    • C++借助STL、面向对象以及模板,可以大大缩短开发时间,提高维护性
  • 代码复用

    • C通过函数、头文件“共享”代码
    • C++支持继承和模板,实现更灵活的复用

四、具体关键特性比较逐点分析

1. 面向对象支持

  • C:不支持面向对象,程序依赖数据和代码的组合实现功能
  • C++:支持类、继承、多态、抽象、封装,允许你用“对象”描述问题,更接近人类认知

2. 函数重载

  • C:不能定义多个同名但参数不同的函数
  • C++:支持重载(一个函数可以有多个不同参数版本)

3. 作用域和命名空间

  • C:全局作用域
  • C++:用namespace避免命名冲突,比如std::空间

4. 模板和泛型编程

  • C:没有模板机制
  • C++:支持模板,可以编写通用函数和类(如vector<T>

5. 异常机制

  • C:错误处理方式单一,多用返回值或全局变量
  • C++:提供try-catch机制,更优雅地应对错误

6. 标准库丰富程度

  • C:较少,主要函数在<stdio.h><stdlib.h>
  • C++:标准库极其丰富,如IO流(<iostream>)、容器(<vector><map>)、算法(<algorithm>

7. 内存管理

  • C:手动控制,malloc()free()
  • C++newdelete,而且引入智能指针(如shared_ptrunique_ptr),避免内存泄漏

8. 继承和多态

  • C:不支持
  • C++:支持类继承、多态调用(虚函数实现动态联结)

9. 访问控制

  • C:结构体成员通常全部公开
  • C++:可以定义成员的访问权限(privateprotectedpublic

五、总结

  • C:适合系统底层、硬件开发,追求极致性能和简洁
  • C++:适合开发大型复杂应用、游戏引擎、数据库、插件,代码更易维护和复用

六、补充思考

  • 为什么学C语言?
    • 理解底层原理,掌握硬件操作
    • 作为学习C++的基础,不可或缺
  • 为什么学C++?
    • 面向对象编程能力,支持现代软件工程
    • 利用STL、模板快速开发高效代码

相关文章:

  • Void: Cursor 的开源平替
  • Android 中 图片加载库 Glide 简介
  • 【Oracle专栏】扩容导致数据文件 dbf 丢失,实操
  • React 第四十节 React Router 中 useBeforeUnload的使用详细解析及案例说明
  • LeRobot 框架的核心架构概念和组件(中)
  • R语言机器学习算法实战系列(二十五)随机森林算法多标签分组分类器及模型可解释性
  • 机器视觉助力轨道缺陷检测
  • AR禁毒:科技赋能,筑牢防毒新防线
  • 【计算机视觉】OpenCV实战项目:GraspPicture 项目深度解析:基于图像分割的抓取点检测系统
  • 掌握Docker Commit:轻松创建自定义镜像
  • 双目云台摄像机:双摄安防功能全方位
  • 基于运动补偿的前景检测算法
  • [20250514] 脑机接口行业调研报告(2024年最新版)
  • Vue.js---嵌套的effect与effect栈
  • 《数据库原理》部分习题解析1
  • 数据防泄密安全:企业稳健发展的守护盾
  • NVMe简介2
  • C# 通过脚本实现接口
  • centos6.10在Macbook m芯片上使用
  • OpenCV CUDA 模块中用于在 GPU 上计算矩阵中每个元素的绝对值或复数的模函数abs()
  • 马上评|安排见义勇为学生补考,善意与善意的双向奔赴
  • 山东市监局回应“盒马一批次‘无抗’鸡蛋抽检不合格后复检合格”:系生产商自行送检
  • 马上评|“为偶像正名”的正确做法是什么
  • 广州一饮品店取名“警茶”?市监局:取名没问题,但图像会产生误解
  • 重庆大学通报本科生发14篇SCI论文处理结果
  • 中国科协发声:屡禁不止的奇葩论文再次敲响学风建设警钟