您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

C++在C的基础上增加了什么

时间:01-10来源:作者:点击数:

C++ 读作“C加加”,是“C Plus Plus”的简称。顾名思义,C++是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”,就像 iPhone 6S 和 iPhone 6、Win10 和 Win7 的关系。

从C到C++

C语言是1972年由美国贝尔实验室研制成功的,在当时算是高级语言,它的很多新特性都让汇编程序员羡慕不已,就像今天的Go语言,刚出生就受到追捧。C语言也是“时髦”的语言,后来的很多软件都用C语言开发,包括 Unix、Linux、Windows 等操作系统。

但是随着计算机性能的飞速提高,硬件配置与几十年前已有天壤之别,软件规模也不断增大,很多软件的体积都超过 1G,例如 PhotoShop、Visual Studio 等,用C语言开发这些软件就显得非常吃力了,这时候C++就应运而生了。

C++ 主要在C语言的基础上增加了面向对象编程(OOP)和泛型编程(GP),以适用于大中型软件的编写。

面向对象编程(Object Oriented Programming,OOP)

在编程过程中,我们通常会把重复使用或者具有某项功能的代码打包成一个模块,这样以后自己使用或者把代码给别人使用时都非常方便。那么,如何理解这里说的“模块”呢?

以台式机为例,它的主要硬件包括 CPU、内存、硬盘、主板、显示器、键盘、鼠标、音响等,它们由不同的公司生产,相互之间没有联系,但是这些硬件却能够很好地协调工作,一起帮助用户完成任务。这里的每个计算机硬件就可以理解为一个模块(Module)。

之所以要进行模块化生产,是因为产品过于复杂,不能由一个部门(公司)完成,需要多个部门之间分工合作,这样每个部门只需要生产一个模块,最后再把它们组装起来,就是一款完美的产品。

同样的道理,一个程序往往也由多个模块构成,每个模块可以独立地完成一部分功能,整合在一起就能够完成一项复杂的任务。程序员之间只要提前规范好各个模块的功能和使用方式,就可以各干各的工作了。程序员在编写模块代码的过程中不需要跟别人沟通,他可以自由发挥,只要他的模块能够和别人的模块对接上就行。他也不需要告诉别人这个模块内部的原理和细节,别人也没有必要知道,会用就行。

模块化的思想省去了重复造轮子的过程,细化了分工,降低了合作成本,使得大型软件的开发称为可能。和C语言相比,C++ 在模块化开发上下足了功夫。

在C语言中,我们会把重复使用或具有某项功能的代码封装成一个函数,将拥有相关功能的多个函数放在一个源文件,再提供一个对应的头文件,这就是一个模块。使用模块时,引入对应的头文件就可以。

而在C++中,多了一层封装,就是类(Class)。类由一组相关联的函数、变量组成,你可以将一个类或多个类放在一个源文件,使用时引入对应的类就可以。下面是C和C++项目组织方式的对比:

 

图1:C语言中项目的组织方式 

 


图2:C++中项目的组织方式

不要小看类(Class)这一层封装,它有很多特性,极大地方便了模块化开发,它让C++成为面向对象的编程语言。类(Class)是C++最为重要的一项改进。

类是一个通用的概念,C++、Java、PHP、Python 等很多编程语言都支持类,你可以通过类来创建对象(Object)。

各位读者先不要深究类(Class)、对象(Object)和面向对象(OOP)的概念,目前只需要记住,支持类和对象的编程语言就是面向对象的,而像C语言,只能把代码封装到函数,没有类,所以是面向过程的。所谓面向过程,就是通过不断地调用函数来实现预期的功能。

面向对象编程在代码执行效率上绝对没有任何优势,它的主要目的是方便程序员组织和管理代码,快速梳理编程思路,带来编程思想上的革新。

面向对象程序设计,是针对开发中大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。

如果你希望开发一个贪吃蛇游戏,类和对象或许是多余的,几个函数就可以搞定;但如果开发一款大型游戏,那你绝对离不开面向对象。

泛型编程(Generic Programming,GP)

C语言中的函数在定义时要指明形参的类型,调用函数时也必须提供类型相同的实参。但在C++中,函数参数的类型可以不受限制,也就是说,定义函数时不需要为形参指明具体的类型,调用函数时可以传递任意类型的实参,编译器会根据实参的类型随时改变形参的类型。

由此可见,所谓“泛型”就是“宽泛的类型”,函数可以处理的数据的类型不再受到限制,一个函数可以接收任意类型的数据。C++对泛型的支持非常好,函数只是泛型的一个重要的体现,后续教程中我们会讲解更多。

泛型的典型使用场景是处理数据结构。以链表为例,它的节点的类型没有任何限制,可以是 int、float 等基本类型,也可以是结构体(Struct)、类(Class)等派生类型,想要使用C语言编写一个适用于任何类型的处理链表节点的函数,简直是不可能完成的任务,程序员必须为每种类型都编写一个特定的函数。而有了C++泛型,这些看似不能解决的问题变得易如反掌,C++ 天生就对类型“迟钝”。

C语言也能实现通用化的数据结构库,不过在编写和使用上都非常蹩脚,例如 libcstl、GDSL。

泛型是C++的首创,最初的动力也是开发一套易用的、适用于各种类型的数据结构库,后来的 Java、C# 也都向 C++ 学习,支持了泛型编程。

总结

面向对象编程(OOP)和泛型编程(GP)是C++的重大改进,本教程也将对这两方面进行深入讲解。读者暂时不用深究面向对象编程(OOP)和泛型编程(GP)的概念,本节也仅仅是简单介绍,浅尝辄止。 

C++代码

C语言源文件后缀为.c,C++源文件后缀为.cpp。C/C++ 使用相同的编译器,Windows 下一般是微软的 cl.exe,Linux 下一般是 GCC。

很多C语言初学者创建源文件时使用的后缀为 .cpp(或许你并没有注意),也完全没有问题,编译、链接、运行都顺利通过。这是因为C++几乎完全兼容C语言,它们类似子集(C语言)和超集(C++)的概念。也就是说,仅仅给你一段C语言代码,你将无法确定它到底是C语言代码还是C++代码。

不过C语言和C++的编译方式不同,.c 源文件会按照C语言的方式编译,.cpp 源文件会按照C++的方式编译。后续我们会在编译原理中讲解。

学习C++可以使用与C语言相同的IDE,请查看:

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门