C++
C++(C plus plus)是一种面向对象的程序设计语言,具有泛型编程和与c语言兼容等特点,被广泛应用于各个领域的软件开发和系统编程。C++ 是一种高效的编程语言,其提供了指针、引用和内存管理等特性,可以直接操作内存。从设计上讲 C++ 在C语言的基础上引入了静态数据成员、类的成员函数,增强了共享性;引入了继承、模板和多态机制以支持重用性。
C++由C语言扩展升级而产生,最早于1979年由本贾尼·斯特劳斯特卢普(Bjarne Stroupstrup)博士在美国AT\u0026T贝尔实验室以C语言为基础研发,其主要增加了类的设计,增强了C语言的共享能力。1987年,Cfront 2.0 发布,增强了 C++ 的面向对象的程序设计(object oriented programming,OOP) 功能,使其 OOP 方法论、设计风格和设计模式等开始流行。1994年,STL 正式成为 C++ 标准库,丰富了 C++ 语言的抽象表达能力,使 C++ 的程序代码变得更加高效易读。1998年8月,ISO 标准被正式通过,意味着 C++ 正式接纳了 STL 和异常处理的加盟以及C++语言的成熟与标准化。到了21世纪,C++ 标准不断变化改进,引入了包括模组和协程等在内的众多新特性,逐渐成为使用最广泛的编程语言之一。
C++ 具有丰富的数据类型和运算符,以及结构化的控制语句,能直接访问和控制硬件。C++ 标准库提供了丰富的库函数,以及类、模板等功能,使得程序员的工作更加轻松。随着云计算和大数据的兴起,C++ 语言的普及度越来越高。截至2024年5月,在 TIOBE 对编程语言人气的排名中,C++ 排名第3。
发展历程
C++ 的“面向对象初探与初生阶段”
20世纪70年代初期,为了移植与开发 unix 操作系统,美国 AT\u0026T 贝尔实验室的里奇博士(D. M. Ritchie)设计开发了一种通用的、面向过程的计算机程序设计语言,即c语言,其既具有高级语言的特点,又具有汇编语言的特点。因此,C语言可以作为操作系统设计语言,编写系统程序,也可以作为应用程序设计语言,从而编写不依赖计算机硬件的应用程序。
20世纪80年代初期,美国 AT\u0026T 贝尔实验室的本贾尼·斯特劳斯特卢普(D.B.Stroustrup)博士以C语言为基础发明并实现了C++。起初,这种语言被称为带类的C,其主要增加了类的设计,尽管当时还缺少运算符重载、引用和虚函数等,但大大增强了c语言的共享能力,使得程序员能够改进编写程序的质量,并易于程序代码的复用。1983年,C++ 名字定下来,并正式向外发布。同时,C语言的大多数内容被保留了下来,很多情况下C语言和C++ 可以互相转化,甚至不用对代码进行任何修改。
1985年10月,第一个 C++ 商业版本发布,该版本是 AT\u0026T 的 Cfront1.0 版本,包括多数最重要、最常用的 OOP 功能,如类、类继承、构造函数和析构函数、new/delete 操作、虚拟函数、内联函数、操作符重载、public 和private 数据保护、友元、关键字等。
1986年,由 D.B.Stroustrup 博士编写的关于C++语言的书籍《The C++ Programming Language》出版。该书以简洁的笔法和简短的案例,影响了一代 C++ 程序员的风格和习惯,是当时真正有影响、有使用价值的书籍之一。
1987年,Cfront2.0 发布。该版本主要增强了 C++ 的 OOP 功能,其主要特征包括多重继承、抽象类、静态成员函数、保护成员、常量成员函数、成员指针。这些功能使 C++ 的 OOP 方法论、设计风格和设计模式等开始流行,C++ 因此真正成为了一门富有哲理性的深的程序设计语言。
1990年,玛格丽特·埃利斯(Margaret A. Ellis)和D.B.Stroustrup博士编写的书籍《The Annotated C++ Reference Manual》出版,该书籍是在 C++ 标准化之前,唯一一本能帮助程序员精确理解 C++ 语言构造和语义的书籍。例如,关于 MI 语义层面的描述以及包括内存布局、delta 值的设立等的实现方案,在这本书之前几乎找不到参考文献。
C++ 的“STL与Boost时代”
1994年,由斯捷潘诺夫博士(Alex Stepanov)主持开发的 STL(standard template library,标准模板库)被 ANSI/ISO C++ 委员会接受,正式成为 C++ 标准库。STL 的诞生使 C++ 语言有了自己的基本函数库,丰富了 C++ 语言的抽象表达能力,拓展了 OOP 语言对多态性的理解。STL 里整合了许多常用数据结构和算法模板,使用 C++ 进行程序开发的代码变得更加高效、整洁和易读。
1998年,Boost 社区出现,其由许多 C++ 开发人员群组组成,通过其以及几个邮件列表进行协调沟通。boost 社区开发和发布了 Boost C++ 库。Boost 库是一个可移植、提供源代码的 C++ 库,是C++ 标准化进程的开发引擎之一和程序扩展库的总称。标准模板库(STL)和 Boost 等程序库的出现,使泛型程序设计在 C++ 中占据了越来越多的比重。
C++ 的“复杂性崭露与标准之路”
1998年8月,ISO 标准被正式批准。C++ 正式国际标准(ISO/IEC 14882:1998)的出台,标志着 C++ 语言的成熟与标准化,意味着 C++ 正式接纳了 STL 和异常处理(exceptional handling)的加盟,促进了之后10年 C++ 语言的不断发展。
2007年,C++ TR1(C++技术报告1,TR1)(ISO/IEC TR 19768)公布,受到了C++ 界的广泛关注。TR1 是为了解决 STL 值语义对指针和 REF 的支持不足等问题而提出的改进建议。2011年,C++11 颁布,其正式接受了 TR1,大大改善了 STL 的性能。同时,C++ 语言的语法有了实质性的提升,增加了包括Lambda表达式、并行程序设计(parallel programming)、多线程(multithreading)、value reference 和转移构造函数(move constructor)等 OOP、FP 概念和语言构造。
随着以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++ 通过将新技术和原有技术融合进行创新发展。C++ 标准也在不断演进,其先后发布了包括 C++14、C++17 和 C++20 等多个版本,每个版本都引入了新的功能和改进,进一步丰富了 C++ 的特性集合。其中,C++20 标准是近十年来影响最大的一个版本,其新特性包括模组(modules)、协程(coroutines)、视图(view)等,进一步提高了 C++ 的表现力和可维护性。
设计原则和语言特点
设计原则
主要特点
C++工作原理
C++ 程序从编写到最后得到运行结果的过程称为程序开发过程,具体流程如下图所示:
语法和结构
基本语法
常量和变量
编写程序时已经确定的值,称为常量;尚不确定的值,称为变量。
在定义变量时,需要注意变量名必须以字母或下划线开头,且其他字符必须是字母、数字或下划线,不得使用空格和其他特殊符号;不可以是系统的保留字,如int、double、for、return等;在C++语言中,变量名是区分大小写的,例如,ABC、Abc和abc是3个不同的变量名。
标识符
标识符是由程序员定义的记号,用来对 C++程序中的符号常量、变量、用户自定义函数、函数的参数、语句标号结构和类以及其他对象的名称进行标识的符号。在C++语言中,标识符需要遵循的命名规则如下:
关键字
关键字是组成编程语言词汇表的标识符,是C++的核心,不能用于其他用途。例如,变量名是一种标识符,在程序中,只要不使用C++预定义的关键字,就可以随意选择变量名。
数据类型
数据类型描述了数据实体的特性,包括值、内存空间大小等信息。每个类型实体所占的内存空间大小是不同的,对应的取值范围也不同。
运算符
运算符是指对常量或变量进行运算及处理的符号,也是构成表达式的重要元素。C++中具有极其丰富的运算符,这些运算符又具有不同的优先级和结合性,使得C++能够进行各种复杂的数学、工程等运算。
语法结构
程序中的基本控制结构顺序结构、选择结构和循环结构三种。C++ 中提供了这三种结构的控制语句。语句是 C++ 程序中最小的可执行单元,一条语句由一个分号结束。
顺序结构
所谓顺序结构,就是指按照语句在程序中的先后次序一条一条的顺序执行。顺序控制语句是一类简单的语句,包括表达式语句、复合语句、空语句和输入/输出语句等。
选择结构
C++ 中的选择控制语句有if语句、if...else 语句、if...else if 语句和 switch 语句。
if 语句
if 语句用于在程序中有条件地执行某一语句序列,其基本语法格式和程序示例如下:
if...else 语句
在“条件表达式”为真和为假时分别执行不同的语句,用 else 来引入条件表达式为假时执行的语句序列。其基本语法格式和程序示例如下:
另外,简单的 if..else 语句,可以使用条件运算符来代替。条件运算符是具有三个操作数的三目运算符,由“?”和“:”组成,其一般语句格式和示例如下:
if...else if 语句
if...else if 语句用于进行多重判断,其基本语法格式和程序示例如下:
该功能语句执行顺序为:先计算“条件表达式1”给出的表达式值,如果该值为真,则执行“语句1”,执行完毕后转到该条件语句后面继续执行其后的语句;如果该值为假,则继续计算“条件表达式2”给出的表达式值。如果“条件表达式2”的值为真,则执行“语句2”。依此类推,如果所有条件中给出的表达式值都为假,则执行 else 后面的“语句n+1”。如果没有 else,则什么也不做,转到该条件语句后面的语句继续执行。
switch 语句
switch 语句也称为开关语句,用于有多重选择的场合,测试某一个变量具有多个值时所执行的动作,其基本语法格式和程序示例如下:
该功能语句的执行顺序为:先计算 switch 语句中“整型表达式”的值,然后在 case 语句中寻找值相等的整型常量表达式,并以此为入口标号,开始顺序执行。如果没有找到相等的整型常量表达式,则从“default:”开始执行。
循环结构
循环控制语句提供重复处理的能力,当某一特定条件为真时,循环语句就重复执行,并且每循环一次,就会测试一下循环条件,如果为假,则循环结束,否则继续循环。C++ 支持 while、do while 和 for 三种格式的循环控制语句。
while 语句
while 循环,也称为前置条件循环或当型循环。其基本语法格式和程序示例如下:
该控制语句的执行顺序为:当“条件表达式”的运算结果为真时,则重复执行“语句”。每执行一次“语句”后,就会重新计算一次“条件表达式”;当该表达式的值为假时,循环结束。
do while 语句
do while 循环和 while 循环相似,只不过循环的控制条件测试放在了循环体的后面,称为后置循环,或直到型循环。do while 循环保证了循环体语句至少执行一次,其基本语法格式:
该控制语句的执行顺序为:先执行循环体语句,后判断循环条件表达式的值。表达式的值为真,继续执行循环,表达式的值为假,则结束循环。程序示例如下:
for 语句
for 循环的使用最为灵活,既可以用于循环次数已知的情况,也可以用于循环次数未知的情况。其基本语法格式和程序示例如下:
该控制语句的执行顺序为:先执行“初始化语句”,再计算“表达式1”的值,如果“表达式1”的值为真,则先后执行后面的“语句”和“表达式2”,然后继续计算“表达式1”;如果“表达式1”的值为假,则结束循环。
跳转结构
C++ 中有 break、continue、goto和return 4种无条件跳转语句。其中,break 和 continue 可用于循环语句中,break 亦可用于 switch 语句中;回车键 语句用于实现函数返回。
break 语句
break 语句可用于switch 和循环语句中,分别有以下两种用途:
break 语句的格式和程序示例如下:
continue 语句
continue 与break 不同的是,continue 语句是使程序跳过本次循环的剩余语句,并回到循环的条件测试部分,重新开始执行循环,而不是立即终止所在循环。
continue 语句的格式和程序示例如下:
goto 语句
goto 语句要求有一个标号,后面跟有冒号的有效标识符。标号必须与使用它的 goto 语句在同一函数中,即不能在不同函数之间跳转。goto 语句的一般形式和示例如下:
return 语句
return 语句用来明确地从一个函数中返回,因为其可使程序返回到调用函数的地方继续执行,所以C++将它归入跳转结构。return 带回的数值即为函数的返回值。
其他相关语句
一个 C++ 程序是由一系列语句组成的。C++ 提供了许多不同类型的语句,每条语句都有一个预定义的任务。
声明语句
表达式语句
表达式语句是以英文分号结尾(作为结束符)的表达式。表达式有一个值,且可能还有副作用。当在程序中出现表达式语句时,计算机确定其值并执行其副作用,从而改变计算机的内存状态。没有副作用的表达式作为语句是无用的。
空语句
空语句是不执行任何操作的语句,一般用于 C++ 语法需要语句但不需要副作用的场合。代码示例如下:
复合语句
在一对花括号内组合任意数量的语句,将其视为单条语句,即为复合语句,也称为语句块,一般用于 C++ 语法需要单条语句但实际需要多条语句时。代码示例如下:
标准库函数
标准库
C++ 标准库(standard library)提供了丰富的函数集合,可以进行常用的数学计算、字符串操作、字符操作、输入/输出、错误检查和许多其他操作。这些函数提供了许多程序员需要的功能,使得程序员的工作更加轻松。C++ 标准库函数是在C++编程环境中提供的。
函数
C++ 中的模块称为函数(function)和类(class)。其中函数可分为程序员定义函数(programmer-defined function)和C++标准库中的预装函数。C++程序一般由程序员定义函数和预装函数组合而成,程序员可以通过函数调用(function call)来调用(invoke)函数,让其完成指定任务。使用函数可使程序区分出许多功能明确的组成部分,简化程序,减少错误。
函数的定义和本质
函数定义包括函数名、参数表列、返回类型和函数体四部分,其一般形式如下:
函数的本质有以下两点:
输入/输出(I/O)
C++数据的输入与输出是通过I\O流来实现的,I\O流输入或输出的是一系列字节。当程序需要在屏幕上显示输出时,可以使用插入符“\u003c\u003c”向cout输出流中插入字符;当程序需要执行键盘输入时,可以使用提取操作符“\u003e\u003e”从cin输入流中抽取字符。另外,C++的I\O类库提供了一些I\O流控制符,可以直接嵌入到输入/输出语句中来实现 I\O格式控制。
字符串处理
C++中的string.h头文件提供了一些字符串处理库函数。
数学函数
在 C++ 中并没有相对的运算符可以用来实现开平方根,次方或三角函数等运算。进行这些运算时,程序需要调用定义在头文件\u003ccmath\u003e里 C++ 的标准数学函数库。
泛型编程与模板
泛型编程
对于函数或类,若将一些类型定义为类型形参就能描述不同具体类型的共同的结构或行为,使得编程具有通用性,称之为泛型编程(Generic Programming)。其具体要求如下:
STL模板库
C++具有的标准模板库(Standard Template Library,STL)是C++代码可重用特性的重要体现,其由Alex Stepanov主持开发,于1998年被加入C++标准。STL是泛型编程的典型代表,其包含了很多基本算法和数据结构,将算法与数据结构完全解耦,使算法不与任何特定数据结构或对象类型绑定(或耦合)在一起,是对类和类模板机制的一种综合应用。
模板
模板(template)是一种类型参量化机制,是代码重用的重要手段,是泛型编程的基础,其以一种独立于任何特定数据类型的方式编写代码。模板是对具有相同特性的函数或类的再抽象,是一种参数多态性的工具,为逻辑功能相同而数据类型不同的程序提供一种代码共享的机制。一个模板是对一个函数或类的描述,是参数化的函数和类,而不是一个实实在在的函数或类。定义模板的一般格式和示例如下:
面向对象
面向对象程序设计
面向对象程序设计(OOP)是通过为数据和代码建立分块的内存区域来提供对程序进行模块化的一种程序设计方法。对象是一个既含数据又含对数据进行操作的代码的一个逻辑实体或软件构造块,是类的一个实例,每个对象在功能上相互之间保持相对独立;类是这些实体的抽象,是描述面向对象程序设计语言定义的一种数据类型。OOP语言具有封装性、继承性和多态性三个主要性质。
类和对象
在C++中,类是用户定义的一种新的数据类型,是数据结构及其密切相关的操作函数的封装体,其明确表达了这种类型数据所能完成的操作。对象是类的一个实例,类似于变量。
一个类由数据和方法两部分组成。使用关键字class来定义一个类,类定义的一般格式和示例如下:
指针和内存管理
指针
C++ 定义了指针类型,并允许使用指针变量,从而操作地址。
指针类型和指针变量
地址
null 指针和 void 指针
按指针传递和按指针返回
内存管理
C++ 编写的程序运行时,会使用内存位置。同时,代码和每个基本对象或者用户自定义的对象也必须存储在内存中。C++ 环境将内存划分为代码内存、静态内存、栈内存和堆内存四种不同的区域,以使内存管理更加高效。
异常处理机制
C++ 提供了一整套面向对象的异常处理机制,其基本思想是将异常的检测与处理分离。C++ 语言异常处理机制将异常定义为类,通过抛出异常对象和截取异常对象两种操作将异常检测和异常处理的逻辑分离。
C++ 异常处理的实现
C++ 异常处理实现的具体操作由保留字 try、throw 和 catch 实现。其中,try 语句块中通常放入可能出现异常的语句,如果检测到某个语句发生异常,则使用 throw 抛出一个异常对象,catch 负责捕获各种异常并做并做相应外理。
异常抛出
异常捕获
异常自定义
C++ 允许开发者定义自己的异常类,以便更具体地描述异常情况。类 exception 设计为可以继承的,意味着可以根据自己的项目情况派生自定义的异常类型。
标准异常
C++标准库中定义了各种各样预置的异常,这些异常都是Exception类的子类。Exception定义在\u003cexception\u003e头文件中,它的子类大多数都定义在\u003cstdexcept\u003e中,主要包括从 Exception 直接派生的异常类、从 logic_error 派生的逻辑异常和从 runtime_error 派生的运行时异常三种。
局限性
环境和工具
编译器
编译器的功能是将源程序编译成二进制形式的“目标程序(object program)”,同时对源程序的语法进行检查,经过编译后的程序文件以“.obj”为目标程序的拓展名。
IDE
应用领域
C++ 是一种通用的编程语言,具有高效的运行效率,被广泛应用于嵌入式系统开发、游戏开发等接近系统底层且对运行效率要求高的领域。
未来发展
跨平台开发
跨平台开发是程序设计领域在近些年提出的新的要求,源自于现代软件工程的发展,其主要目的就是要让所开发的应用程序可以在不同类型的平台上顺利运行。Boost等跨平台开发工具和框架已经让C++开发者能够更方便地构建跨平台应用。随着这些工具的不断进步,C++在跨平台开发中的优势将更加明显,使开发者能够更高效地针对多个操作系统和设备进行开发。
对分布式计算语言层面的支持
随着大数据计算的飞速发展,分布式计算是未来程序设计的一个重要趋势,由此而来的是分布式计算资源的管理。C++语言最初就是为了描述分布式UNIX OS而设计的,例如C++11引入了一些基本的本地并行计算概念,如thread、atomic、mutext等。未来,C++可以进一步增强其并发和并行编程能力,满足分布式计算日益增长的需求。
参考资料
cplusplus.C++ Language Tutorial.2024-05-18
Cfront releases. C++ Historical Sources Archive.2024-06-03
C/C++编程环境搭建.deepin指南.2024-05-17
TIOBE Index for May 2024.TIOBE Index.2024-05-17
C++ 与 Boost.Boost C++库.2024-05-27
News, Status & Discussion about Standard C++.C++.2023-09-15
ISO/IEC 14882:2003 - Programming languages -- C++.国际标准化组织.2023-09-06
ISO/IEC 14882:1998.ISO.2024-06-03
ISO/IEC TR 14882:2003.ISO.2024-06-03
C++11.cppreference.com.2024-05-27
C++14.cppreference.com.2024-05-27
C++17.cppreference.com.2024-05-27
C++20.cppreference.com.2024-05-27
ISO/IEC TR 19768:2007.ISO.2024-06-04
ISO/IEC TR 29124:2010.ISO.2024-06-04
ISO/IEC TR 24733:2011.ISO.2024-06-04
ISO/IEC TS 18822:2015.ISO.2024-06-04
ISO/IEC TS 19570:2015.ISO.2024-06-04
ISO/IEC TS 19841:2015.ISO.2024-06-04
ISO/IEC TS 19217:2015.ISO.2024-06-04
ISO/IEC TS 19571:2016.ISO.2024-06-04
ISO/IEC TS 19568:2017.ISO.2024-06-04
ISO/IEC TS 21425:2017.ISO.2024-06-04
ISO/IEC TS 22277:2017.ISO.2024-06-04
ISO/IEC TS 19216:2018.ISO.2024-06-04
ISO/IEC TS 19570:2018.ISO.2024-06-04
ISO/IEC TS 21544:2018.ISO.2024-06-04
最佳 C++ IDE 清单.2021 最佳 C++ IDE 排行.2024-05-17
Is Unity Engine written in Mono/C#? or C++.web.2024-06-04