Skip to content

C++概述

C++简介

C++中的++来自于C语言中的递增运算符++,该运算符将变量的值增加1。C++起初也叫C with clsss。通过名称表明,C++是对C的扩展,因此C++是C语言的超集,这意味着任何有效的C程序都是有效的C++程序。C++程序可以使用已有的C程序库。

为什么C++不叫++C呢?因为它虽然对C进行了改进、扩展,但是很多人还是把它当做C来使用。C++中的++为后置++,先对C进行扩展,但返回的还是C。

——笑话

库是编程模块的集合,可以在程序中调用它们。库对很多常见的编程问题提供了可靠的解决方法,因此可以节省程序员大量的时间和工作量。

C++语言在C语言的基础上添加了面向对象编程泛型编程的支持。C++继承了C语言高效、简洁、快速和可移植的传统。

C++融合了3种不同的编程方式:

  • C语言代表的过程性语言;

  • C++在C语言基础上添加的类代表的面向对象语言;

  • C++模板支持的泛型编程

C语言和C++的关系 C++语言是在C语言的基础上,添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上都非常相似,所以我们常常将这两门语言统称为“C/C++”。

C语言和C++并不是对立的竞争关系

  • C++是C语言的加强,是一种更好的C语言;
  • C++是以C语言为基础的,并且完全兼容C语言的特性。

C语言和C++语言的学习是可以相互促进的。学好C语言,可以为我们将来进一步地学习C++语言打好基础,而C++语言的学习,也会促进我们对于C语言的理解,从而更好地运用C语言。

C++的诞生

与C语言一样,C++也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在20世纪80年代在这里开发了这种语言。

Stroustrup关心的是让C++更有用,而不是实施特定的编程原理或风格。在确定语言特性方面,真正的编程比纯粹的原理更重要。Stroustrup之所以在C的基础上创建C++,是因为C语言简洁、适合系统编程、使用广泛且与UNIX操作系统联系紧密。

用他自己的话来说,“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或者其他现代高级语言来编程而设计的。它的主要功能是可以更方便得编写出好程序,让每个程序员更加快乐”。

C++语言标准

假设为运行Windows 2000系统的老式奔腾PC编写了一个很好用的C++程序,而管理员决定使用不同操作系统(比如说Mac OS 或 Linux)和处理器的计算机替换它。该程序是否可在新平台运行呢?当然,但是必须使用为新平台设计的C++编译器重新编译。但是是否需要修改写好的代码?如果不需要修改代码的情况下,重新编译程序后,程序依然运行良好,该程序是可移植的。

程序是否可移植性有两个问题需要解决。

  • 第一是硬件,针对特定硬件编程的程序是不可移植的;
  • 第二是语言的实现,Windows 和 Linux 或 Mac OS 对C++的实现不一定相同。

虽然我们希望C++版本与其他版本兼容,但是如果没有一个公开的标准很难做到。因此,美国国家标准局(American National Standards Institute,ANSI)在1990年设立一个委员会专门负责制定C++标准(ANSI制定了C语言的标准)。国际标准化组织(International Organization for Standardization,ISO)很快通过自己的委员会加入到这个行列,创建了联合组织ANSI/ISO,制定C++标准。

经过多年的努力,制定出了一个国际标准ISO/IEC 14882:1998 ,并于1998年获得了ISO、IEC(International Electrotechnical Committee,国际电工技术委员会)和ANSI的批准。这个标准就是我们经常所说的C++ 98。它不仅描述了已有的C++特性,还对语言进行了扩展,添加了异常、运行阶段类型识别(RTTI)、模板和标准模板库(STL)。

2003年,发布了C++标准第二版(IOS/IEC 14882:2003),这一版本对第一版修订了一些错误,但并没有改变语言特性,因此C++ 98表示C++ 98/C++2003。C++ 98也叫标准C++/C++1.0。

C++不断发展。IOS标准委员会于2011年8月批准了新标准ISO/IEC 14882:2011,该标准被称为C++ 11,与C++ 98一样。也被称为/C++2.0。

C++ 14、C++ 17、C++20、C++23等后续版本。

ISO C++标准还吸收了ANSI C语言标准,C++尽量做到是C的超集。意味着在理想情况下,任何有效的C程序都应该是有效的C++程序

ANSI不仅定义了C语言,还定义了一个ANSI C必须实现的标准C库。C++也在使用这个库,另外ANSI/ISO C++标准还提供了一个C++标准类库。

有关C++标准库的详细信息请详阅CPP标准库或cpp reference

为什么C++会成功

C++最初的目的是将C语言转变为OOP(面向对象程序设计)语言,但是C++后来并没有这么做,而是立足于程序的实际。因为在C语言方面大量投入的程序员使其完全丢掉C语言那种编程的思考方式,转而去接受一种新的语言、新的思维,那么将会导致这些程序员中大部分人在短时间内可能毫无成果,使其生产率降低。但是如果让这些C程序员在已有知识的基础上,再去学习C++语言,理解运用OOP,那么也只是在其已有思维的基础上进行扩展而已,这样可以保持其更好的生产率。

简而言之,强迫程序员放弃C语言和C语言的思考方式,而去转到OOP上是需要代价的;但是从C语言转到C++所花费的代价就会小很多。所以也可以理解为C++的出现并不是去替代C,而是对C的扩展,所以在C++中既可以使用C++新特性,并且可以使用C的过程式思维来编写程序。

对于传统的结构化语言,我们向来没有太多的疑惑,函数调用那么自然而明显,只是从程序的某一个地点调到另一个地点去执行。但是对于面向对象(OOP)语言,我们疑惑就会很多。其原因就是C++编译器为我们程序员做了太多隐藏的工作:构造函数,析构函数、虚函数、继承、多态.... 有时候它为我们合成出一些额外的函数,有时候它又偷偷在我们写的函数里放进更多的操作。有时候也会给我们的对象里放进一些奇妙的东西,使得我们sizeof的时候结果可我们预期不一样。

学习之道和学习忠告

两大部分

  • C++语言语法学习
  • C++标准库

学习之道

  • 跟着一个好的老师
  • 不停的努力
  • 举一反三

学习忠告

  • 和C语言不一样的设计理念和实现风格;

  • 不要贪大求全。注意领悟编程思想,注意提高自己程序设计的综合能力,以实现更好的开发程序为目的;

  • 学习方面:不要着急,要有一定的覆盖面;

  • 使用方面:一般情况下只会用到C++的一个子集;

  • 积极学习新功能、新写法,使用新功能、新写法来取代之前学习C语言中的一些功能和写法。

有时间建议看一看《C++标准库 第2版》。