C/C++的区别

  美国AT&T贝尔实验室的Bjarne Stroustrup博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,

从给C语言增加类开始,不断的增加新特性,如虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、

异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。

 

  C和C++究竟有哪些区别呢

C是一种面向过程的语言,而C++是面向对象的语言,C++面向对象的三大特征包括数据封装,类的继承,函数多态,此外,C++还引进了函数的重载。这应该是C和C++的最大区别。

 

  C是C++的一个子集,C++对C的增强,表现在以下几个方面

① 类型检查更严格

  比如下面的代码,在.c文件里是可以编译通过的,但是在.cpp文件里是无法编译通过的。 

printf("%d",11.0);

  这是因为在C语言里,并不对11.0进行类型检查,可以成功编译和运行,但是在C++里,发现双精度浮点数11.0和整型格式化描述符%d的类型不匹配,因此编译错误。

② 增加了面向对象的机制

③ 增加了泛型编程的机制(Template)

④ 增加了异常处理

⑤ 增加了运算符与函数重载

⑥ 增加了标准模板库(STL)

⑦ 增加了引用概念,使得引用函数参数带来了很大方便

⑧ 对变量说明更加灵活了。C语言只允许在函数体最开始部分声明变量,再是执行语句,二者不可交叉使用。C++可以对变量随时进行说明

 

   面向对象和面向过程的含义与区别:

 面向过程是先分析解决问题的步骤,然后用函数把这些步骤一步步得实现,然后在使用时依次调用对应的函数即可。

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

下雨的时候,人们为了防止被雨淋打开伞避雨:

面向过程:

下雨了,我打开了伞.

rain();

open(我,伞)

面向对象:

对象:我 伞 雨

行为:雨下,我打开伞

rain,me,umbrella

rain.fall();

me.open(umbrella)

面向过程是把问题分解成若干步骤,每个步骤实现一个函数,一步步实现,然后在使用的时候,把数据传递给这些函数,计算得出结果。面向对象是首先抽象出各种对象,把数据和解决问题的方法封装在对象中,然后各个对象之间通过行为发生作用。

 

  C语言是一种面向过程的编程语言,而C++却是一种面向对象的编程语言。在C++程序里,数据和对数据的处理都被封装在了一个对象里

在面向对象的世界里,用类一个个的构造出对象来,在主程序里调用的是一个个对象的行为。

(1)对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机,以及人等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

(2)对象的状态和行为。

对象具有状态,一个对象用数据值来描述它的状态。

对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。

对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中

(3)类。

具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。

类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。

类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

 

C语言是一种介于汇编语言与高级语言之间的一种开发语言,也称为中级语言,因此效率高,适合于底层开发。而C++语言则用于比C语言更高层的应用开发。

除了上面所说的,在C++中还引入了两个新的关键字const和inline,以代替C语言中的宏定义。那么它们与C语言中的宏有什么区别呢?

#define宏与const和inline的比较。可以通过下面的两种形式来定义圆周率:

#define    PAI  3.1415926      //宏定义

const float pai = 3.1415926   //常变量

在C语言中的宏在编译的时候,编译器只对宏进行简单的替换。在C++中通过const定义一个常变量与C语言中的宏定义相比,常变量具有拥有类型、可调试、可进行参数合法性检查等优点。

下面来看看inline关键字与#define宏的区别:

 

#define  MAX(a, b) a > b ? a : b

class A

{

public:

     inline int getMax(int a, int b);

     …

    

}

int A::getMax(int a, int b)

{

     return a > b ? a : b;

}

 

首先,为什么要使用宏呢?宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。但是宏容易产生二义性,也不能访问对象的私有成员,这是宏的局限。

对于宏的二义性,来看看下面的例子。从下列选项中选择不会引起二义性的宏定义是:

 

A、 #indefine POWER(x)   x*x

B、 #indefine POWER(x)   (x)*(x)

C、 #indefine POWER(x)    (x*x)

D、 #indefine POWER(x)   ((x)*(x))

分析:

A.#indefine POWER(x)     x*x

如果调用POWER(5+6),本意是 (5+6)*(5+6)=121,实际却是:5+6*5+6=41

B.#indefine POWER(x)     (x)*(x)

如果调用POWER(5+6)/POWER(5+6),本意是得到结果为1,实际却是:(5+6)*(5+6)/(5+6)*(5+6)=11*11/11*11=121

C.#indefine POWER(x)(x*x)

如果调用POWER(5+6)+POWER(5+6),本意是 (11*11)+(11*11)=121+121=242,实际却是: (5+6*5+6)+(5+6*5+6)=41+41=82

D.没有二义性。

为了利用宏的优点克服宏的不足便引入了inline机制。内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以像调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

加上了inline关键字的函数,编译器将用它的代码直接进行替换。对于那些代码较少而调用频率较高的函数适合用inline关键字,减小了函数在执行时候的堆栈维护开销。

此外,由于C++中使用了函数重载和名字修饰(name mangling),因此要在C++中引用C代码必须加入下面的声明来引用C语言中的函数库:

 

extern “C”

{

     void func1(int a, in b);

     int func2(int x, int y);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值