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

c语言与c++的区别详解

1从C语言到C++

1980年,Bjarne Stroustrup博士着手创建一种新的语言,能够具有面向对象的程序设计特色。在当时,面向对象编程是一个新颖的概念,Stroustrup博士并不是从头开始设计新语言,而是使用C语言进行修改,而这就是C++语言。

C++是C的超集,也就是说C++是可以兼容C语言的,C++在C语言的基础上增加了许多的特性和概念,他通关关键字的方式进行实现,不过本文不重点说明C++和C语言的区别,本文只是从数据结构的角度去观测两语言之间的问题,并且说明C++的改进,从本文开始,将会在C语言的基础上开始用到C++的特性和概念去实现数据结构,这将方便我们的程序设计。

2.代码改变

介绍几个很明显的转变我们以后会很常用,这些可以在C语言网的C++教程中看到,如果你已经学过C++,建议你可以直接跳过本段内容,如果你对于C++还一知半解的,建议你在阅读本文的同时去翻阅C++的学习资料,两者的学习并不冲突,相反他们相辅相成。

2.1头文件引用

C语言的引用头文件的方式是include名字.h的方式进行引用,而C++去掉了.h(虽然在绝大多数编译器上任然使用.h的方法也不会报错)而是改成直接引用名字即可,这里需要注意的是C++使用C语言标准时,需要在库前面添加一个C来表明这个库是来自于C语言的。

2.2输入与输出

C++的输入输出与C语言指定类型的不同,C++采用“流”的思路去进行输入输出设计,这样的做法可以大大简化我们的设计,但是这样的做法确是更慢,本章稍后会介绍输入输出的优化,将会重讲本内容。

3. 对比

C++与C相比最突出的部分就是多了一个类的概念,由此衍生出了封装,继承,重载,多态。

封装的概念有点像C语言里的结构体,但是结构体不能够成员函数,也不能定义变量的访问权限,也不能够被继承。

而继承就是一个类可以由其父类继承得到,如你定义了一个类为 动物,你可由动物这个类来定义 狗 猪 等等类别。

而重载就是最容易理解的是运算符的重载, 比如在C语言里面的 - 运算符不能够直接实现 (2008.5.1 - 2006.1.2)的运算,而在C++中通过运算符的重载就可以直接实现如上的日期运算了。

而多态比较难以概括,还要涉及到虚函数的概念,简单的说就是可以更具类别来选择相应的成员函数的实现形式。

3.1详细区别对比

3.1.1函数默认值


C语言中:

C89标准的C语言不支持函数默认值

这种操作在C89下是行不通的,在C语言下这么写就会报错。

C++中:

C++支持函数默认值,且需要遵循从右向左赋初始值

例如:int FUN(int a = 10);

代表没有传参调用的时候,自动给a赋一个10的初始值。

赋初始值必须从参数列表的右边开始赋值

3.1.2inline内联函数


C89标准下C语言没有的函数。但类似于宏,只不过宏它是在预编译阶段展开,宏作为预处理并不进行类型检查

C++内联函数和普通函数的区别:内联函数没有栈帧的开辟回退,一般我们直接把内联函数写在头文件中,是在 编译阶段进行处理的。inline函数是要进行类型检查的。没有栈帧的开辟回退。一般写在头文件中。

3.1.3 函数重载


C不存在函数重载,因为C语言中产生函数符号的规则是根据名称产生

C++根据函数名参数个数参数类型判断重载,属于静多态,必须同一作用域下才叫重载。函数的返回值并不能作为函数重载的依据。

3.1.4const


C语言中被const修饰的变量不是常量,叫做常变量或者只读变量,这个常变量是无法当作数组下标的。

C++中const修饰的变量可以当作数组下标使用,成为了真正的常量。定义的时候必须初始化,可以用作数组的下标。也可以通过指针修改。

3.1.5引用


C语言中:兄弟:指针传址

指针可以为空

可以改变指向,而指向其它对象

指针是指针本身的大小,4个字节。

C++中:是原变量的一个别名。

引用底层就是指针,使用时会直接解引用,可以配合const对一个立即数进行引用。

引用不可以为空

不可以改变指向

引用的大小是所指向的变量的大小,因为引用只是一个别名而已

3.1.6malloc,free && new,delete


malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数

new和delete是C++运算符、关键字。new和delete底层其实还是调用了malloc和free

malloc在分配内存前需要大小,还需要类型转换

int *p1 = (int *)malloc(sizeof(int));

new不需要,因为它可以从给出的类型判断,并且还可以同时赋初始值。

int *p2 = new int;

//int *p3 = new int(10);

malloc不安全,需要手动类型转换

new不需要类型转换。

free只释放空间

delete先调用析构函数再释放空间(如果需要

new是先调用构造函数再申请空间(如果需要

malloc失败返回0

malloc开辟在堆区

new可以调用malloc()

new失败抛出bad_alloc异常。

new开辟在自由存储区域

malloc不能调用new

3.1.7作用域


作用域只有两个:局部,全局

C语言中没有命名空间

C++中具有局部作用域,类作用域,名字空间作用域三种。

3.1.8C语言是面向过程语言,而C++是面向对象语言


面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。

C语言主要用于嵌入式领域,驱动开发等与硬件直接打交道的领域

面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。

C++可以用于应用层开发,用户界面开发等于操作系统打交道的领域。

3.1.9输入与输出


cout代表C++的输出流

cin代表C++的输入流

它们都是在头文件“iostream”中定义。

“cout”必须与”<<”一起使用,“<<”起到插入的作用。

在一条语句中可以多次使用“<<”输出多个数据。

3.1.10返回值不同


C语言中,如果一个函数没有指定返回值类型,默认为int类型,并返回一个随机数,一般为0XCCCCCCCC。

在C++中,如果函数没有返回值则必须指定为void型,否则编译不能通过。


http://www.kler.cn/a/291868.html

相关文章:

  • docker 安装之 windows安装
  • 英语中的副词和状语
  • 抽象java入门1.5.3.1——类的进阶
  • 探索美赛:从准备到挑战的详细指南
  • MongoDB在现代Web开发中的应用
  • SOP搭建:企业标准化操作程序构建与实施指南
  • [数据集][目标检测]智慧牧场猪只检测数据集VOC+YOLO格式16245张1类别
  • 理解Sigmoid激活函数原理和实现
  • Linux 硬件学习 s3c2440 arm920t蜂鸣器
  • Trollspeed网速悬浮窗,精简且强大
  • 【ArcGIS Pro原理第一期】各种空间插值原理:GPI、LPI、IDW等
  • Go异常处理机制
  • ByteTrack多目标跟踪(一)—理论基础
  • 【OpenCV】不变矩
  • 云计算day35
  • 设计模式之原型设计模式
  • 列转行-lateral view explode列转行
  • SQLAlchemy:Python SQL工具包和对象关系映射器
  • Kubernetes 简介与部署全攻略
  • 我使用了ChatGPT中的DALL-E创建了7张时尚客厅图片
  • 如何理解进程和线程之间的关系
  • 基于PHP评论区的存储型XSS漏洞
  • 中间件解析漏洞(附环境搭建教程)
  • Rust :也谈Json与转换
  • Harmony南向驱动开发: HDC与真机调试
  • Java【数组】