C和C++区别

C和C++的区别

首先我们先简单介绍一下C语言和C++:

①:C语言的介绍
  • C语言是一个结构化语言,它的重点在于算法和数据结构。C语言的设计首要考虑的是如果通过一个过程对输入进行运算处理得到输出。
  • C语言可以做任何用处,但最大的用处还是写写操作系统和编译器之类的。
  • C语言是非常有效率的,作为一个底层编译语言,可以通过指针直接去对内存进行管理,另外很多语言都是用C语言来设计的,如java,python。
②:C++的介绍
  • C++是对C语言的继承与发展,C++功能很强大,可以应用开发大型应用软件。即可以面对对象,也可以兼容C语言面对过程。
  • C++是一种复杂,难以掌握的语言,不仅仅体现在语法上,更体现在四种编程思维模型上。由此C++是既有效率,又有弹性;既面对对象,又可以面对过程。
  • C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计,数据抽象,面对对象程序设计,泛型程序设计等多种程序设计风格。
下面我们简述C和C++有什么不同:
  • C语言是面对过程的,而C++是面对对象的。C和C++都有结构的概念,但是在C语言中结构只有成员变量,没有成员方法,而在C++结构中,它可以有自己的成员变量以及成员方法。
  • C语言中结构的成员是默认是公共的,而在C++中没有加限定符则默认是私有的。
  • C++中有bool类型,而C语言可没有bool类型,均为数值类型
  • const关键字要注意一点不同就是C++的类函数,类函数声明时可以用const,表示这个函数没有改变类中的任何属性。例如:void
    func()const; ,而C语言中则不可以。

一、函数的默认值

  • 默认值一般写在声明中
  • 默认值传值方式为 自右向左 依次赋值
  • 默认值赋值只能赋一次
  • 默认值的限制

1、可以传全局变量在这里插入图片描述
2、甚至函数也可以作为默认值
在这里插入图片描述

3、默认值传值方式为 自右向左 依次赋值在这里插入图片描述

二、函数重载

重载函数是函数的一种特殊情况,C语言中的函数不能重名,同名函数会出现重定义。

但是为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的参数列表(指参数的个数、类型或者顺序)必须不同,也就是说同名函数完成不同的运算功能,这就是重载函数。

重载函数常用来实现功能类似而所处理的数据类型不同的问题。但不能只有函数返回值类型不同。

函数重载三要素:
  • 同作用域下才能重载
  • 同名函数
  • 参数列表不同
函数重载的注意事项:
  • 函数名相同,参数列表相同,只用返回值不同,不能构成函数重载
  • 一个函数不能即作为重载函数,又作为有默认参数的函数。因为当调用函数时如果少些一个参数,系统无法判断是使用少一个参数的重载函数还是使用利用默认值的函数,这就出现了二义性,系统只能报错。
    在这里插入图片描述

三、内联函数inline

内联函数是在编译阶段,将调用点使用的内联函数的代码直接展开在调用点,并不会生成函数符号。

类似宏定义,但宏定义有几个缺点:

  • 宏调用并不执行类型检查,甚至连正常参数也不检查,但是内联函数在编译阶段却要检查。
  • C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序。
  • 在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。

所以说,内联函数inline相当于安全版本的宏。

当然,inline函数也有自身的不足:

那就是以代码膨胀为代价(以空间换取时间)

所以对于inline函数的使用建议就是:

如果 函数堆栈的开销 > 函数执行的开销 才建议写成inline函数

inline函数的注意事项:

  • inline函数只是给编译器的一个建议,不是强制性的。
  • 函数中有递归,while循环,switch则无效。编译器会把内联函数当作普通函数处理。
  • inline内联函数在Debug版本下不生效,Release版本下生效。
  • inline内联函数是基于实现的,不是基于声明的,不要写在声明上。

四、const在C和C++中的区别

①:在C语言中,被const修饰的内容称作常变量。它本质是一个变量,因此,C语言中const修饰的变量并不能作为初始化数组长度的下标。

其特点只有一个:被修饰的内容不可以作为左值存在。

②:而在C++中,const修饰的内容叫做常量,在编译阶段会被当作立即数,可以当做初始化数组长度的下标。

其特点有两个:1.必须初始化,初始化的值必须是常量。 2.不允许普通的指针指向,只能用const类型的指针指向。

两者区别:

C语言里用const修饰的值可以不初始化,只是之后再没有机会对这个const修饰的变量赋值了。因此我们可以得出c语言里const定义的常变量和一般变量的区别很小,只是常变量定义后不能作为左值存在。但其本质,或者说是编译方式,和普通变量是一样的。

而在C++中,const修饰的量必须初始化,否则编译无法通过,即在编译的时候编译器会把使用const修饰的量都替换为其本身的值,因此就能作为数组下标了,因为编译时,编译器看到的下标并非const 定义的变量的名字,而是它对应的值的立即数。

五、C和C++代码的相互调用

在学习c++中,用到一些古老的c语言库时,在工作中,我们经常要使用C和C++混合编程,那么,在调用对方接口时,总是不可避免地出现问题。为了让双方和谐地工作,我们就得用到extern “C”。

extern "C"

exten‘c’的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。

extern “C” 的使用情况:

C++调用C的接口:
cpp文件中加extern “C”
在这里插入图片描述

C调用C++的接口:

可以修改C++的文件

.cpp文件中加extern “C”(和C++调用C的接口处理方法一样)
不可以修改的C++的文件
利用一个.cpp的中间层的方法
在这里插入图片描述

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值