vlambda博客
学习文章列表

安能辨我是雌雄系列之---C语言和C++

    “ 编程语言类似名字却千差万别,用阿里巴巴里一位前辈的话,就是周杰和周杰伦的区别。



    现在我们常用的C语言是C89标准,C++是C++99标准的。C89就是在1989年制定的标准,如今最新的是C11和C++11标准。根据不同的标准,它们的功能也会有所不同,但是越新的版本支持的编译器越少。今天我们一起探访C语言和C++的前世今生有何爱恨纠缠。



01

联系


C++是C语言的超集,两者拥有类似的语法。C++从根本上已经发生质飞跃,并对C进行丰富的扩展。C是C++的子集,所以大部C语言程序都可以不加修改的拿到c++下使用


02


区别


    

1.C是面向过程的语言,而C++是面向对象的语言

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

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


2.动态分配内存

  C和C++在动态分配内存方面存在差异,C使用malloc/free函数,而C++使用除此之外还有new/delete关键字,

  • C99有32个关键字

  • C++98有63个关键字   

  • 一些关键字的细微区别:

  • (1)struct:在C语言中struct定义的变量中不能有函数,而在C++中可以有函数。

  • (2)malloc :malloc函数的返回值为void*,在C语言中可以赋值给任意类型的指针,在C++中必须强制类型转换,否则报错。

  • (3)struct和class:class是对struct的扩展,struct默认的访问权限是public,而class默认的访问权限是private。

  • (https://blog.csdn.net/cherrydreamsover/article/details/81835976)

3.构造类型

 C语言中没有class,只有struct;C++中两者都有。

class的默认访问修饰符是private,而struct是public。


4.函数重载

    函数重载:函数重载是函数的一种特殊情况,指在同一作用域中,声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,返回值类型可以相同也可以不同,常用来处理实现功能类似数据类型不同的问题。


总结:(C语言没有函数重载,C++支持函数重载,属于静多态,必须同一作用域下才叫重载。这是由于两者的名字修饰不同)。


5.inline内联函数

    内联函数是一个C89标准下C语言没有的函数。它的具体做法和宏非常相似,也是在调用处直接将代码展开,只不过宏它是在预编译阶段展开,而内联函数是在 编译阶段进行处理的。同时,宏作为预处理并不进行类型检查,而inline函数是要进行类型检查的,也就可以称作“更安全的宏”。


    内联函数和普通函数的区别:内联函数没有栈帧的开辟回退,一般我们直接把内联函数写在头文件中,include之后就可以使用,由于调用时直接代码展开所以我们根本不需要担心什么重定义的问题——它连符号都没有生成当然不会所谓重定义了。普通函数生成符号,内联函数不会生成符号。


    关于inline还需要注意的一点是,我们在使用它的时候往往是用来替换函数体非常小(1~5行代码)的函数的。这种情况下函数的堆栈开销相对函数体大小来说就非常大了,这种情况使用内联函数可以大大提高效率。相反如果是一个需要很多代码才能实现的函数,则不适合使用。一是此时函数堆栈调用开销与函数体相比已经是微不足道了,二是大量的代码直接展开的话会给调试带来很大的不便。三是如果代码体达到一个阈值,编译器会将它变成普通函数。


    同时,递归函数不能声明为inline函数。说到底inline只是对编译器的建议,最终能否成功也不一定。同时,我们平常生成的都是debug版本,在这个版本下inline是不起作用的。只有生成release版时才会起作用。


总结:C89没有,在调用点直接展开,不生成符号,没有栈帧的开辟回退,仅在Release版本下生效。一般写在头文件中。

(https://blog.csdn.net/czc1997/article/details/81254971)


6.const

    C语言中被const修饰的变量不是常量,叫做常变量或者只读变量,这个常变量是无法当作数组下标的。然而在C++中const修饰的变量可以当作数组下标使用,成为了真正的常量。这就是C++对const的扩展。


    C语言中的const:被修饰后不能做左值,可以不初始化,但是之后没有机会再初始化。不可以当数组的下标,可以通过指针修改。简单来说,它和普通变量的区别只是不能做左值而已。其他地方都是一样的。


    C++中的const:真正的常量。定义的时候必须初始化,可以用作数组的下标。const在C++中的编译规则是替换(和宏很像),所以它被看作是真正的常量。也可以通过指针修改。需要注意的是,C++的指针有可能退化成C语言的指针。

    const在生成符号时,是local符号。即在本文件中才可见。如果非要在别的文件中使用它的话,在文件头部声明:extern cosnt int data = 10;这样生成的符号就是global符号。


总结:C中的const叫只读变量,只是无法做左值的变量;C++中的const是真正的常量,但也有可能退化成c语言的常量,默认生成local符号。

(https://blog.csdn.net/czc1997/article/details/81254971)


7.引用

C++有引用,而C没有引用


8.后缀

C源文件后缀.c,C++源文件后缀.cpp,在VS中,如果在创建源文件时什么都不给,默认是.cpp


9.返回值

C语言中,如果一个函数没有指定返回值类型,默认返回int类型;C++中,如果一个函数没有返回值则必须指定为void。

 总结:  C89标准的C语言不支持函数默认值,C++支持函数默认值,且需要遵循从右向左赋初始值。


10.参数列表

    在C语言中,函数没有指定参数列表时,默认可以接收任意多个参数;但在C++中,因为严格的参数类型检测,没有参数列表的函数,默认为 void,不接收任何参数。

11.缺省参数

    缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的参。(C语言不支持缺省参数,如果给函数的参数指定了默认参数,在函数调用时既可以带实参也可以不带实参,如果带实参则使用指定实参,否则使用默认的实参。)

  • 注意:
    (1)在半缺省的情况下,带缺省值的参数必须放在参数列表的最后面。
    (2)缺省参数不能同时在函数的声明和函数定义中出现,二者只能选其一。
    (3)缺省值必须是常量或者全局变量。
    (4)缺省参数必须通过值参或常参传递。

12.两者的使用场景

C语言


操作系统:类unix系统(linux/freebsd…)主要基于c开发的

嵌入式领域:驱动开发大部分基于C的,嵌入式系统c开发的


C++


游戏领域:星际争霸、魔兽争霸、CS、帝国时代、跑跑卡丁车、传奇、魔兽世界

办公软件:微软Office、Sun Open Office

图形处理:Adobe Photoshop

网站:eBay、facebook

搜索引擎:Google

图形界面:Microsoft Windows UI、苹果 MacOS UI (Aqua)、KDE (Linux图形界面)

关系型数据库:Oracle 、MySQL

浏览器:微软IE、火狐、苹果Safari 、谷歌Chrome

邮件客户端:Outlook

软件开发集成环境:Eclipse 、Code Blocks、Microsoft Visual Studio

编译器:Microsoft Visual C++

(https://blog.csdn.net/caoyangxiaoyao/article/details/81179960)