176 lines
11 KiB
Markdown
176 lines
11 KiB
Markdown
---
|
||
id: 简介
|
||
title: 简介
|
||
sidebar_position: 1
|
||
data: 2022年2月17日
|
||
---
|
||
|
||
## 简介
|
||
|
||
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
|
||
|
||
C++ 被认为是一种**中级**语言,它综合了高级语言和低级语言的特点。
|
||
|
||
C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。
|
||
|
||
C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
|
||
|
||
**注意:**使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。
|
||
|
||
### 标准化
|
||
|
||
| 发布时间 | 文档 | 通称 | 备注 |
|
||
| -------- | --------------------- | ------ | ------------------- |
|
||
| 2017 | ISO/IEC 14882:2017 | C++17 | 第五个C++标准 |
|
||
| 2015 | ISO/IEC TS 19570:2015 | - | 用于并行计算的扩展 |
|
||
| 2015 | ISO/IEC TS 18822:2015 | - | 文件系统 |
|
||
| 2014 | ISO/IEC 14882:2014 | C++14 | 第四个C++标准 |
|
||
| 2011 | ISO/IEC TR 24733:2011 | - | 十进制浮点数扩展 |
|
||
| 2011 | ISO/IEC 14882:2011 | C++11 | 第三个C++标准 |
|
||
| 2010 | ISO/IEC TR 29124:2010 | - | 数学函数扩展 |
|
||
| 2007 | ISO/IEC TR 19768:2007 | C++TR1 | C++技术报告:库扩展 |
|
||
| 2006 | ISO/IEC TR 18015:2006 | - | C++性能技术报告 |
|
||
| 2003 | ISO/IEC 14882:2003 | C++03 | 第二个C++标准 |
|
||
| 1998 | ISO/IEC 14882:1998 | C++98 | 第一个C++标准 |
|
||
|
||
### 发展历程
|
||
|
||
- C++ 编程语言的历史可以追溯到 **1979 年**,当时 Bjarne Stroustrup 为博士学位论文进行了一些开发。在 Stroustrup 可以使用的所有语言中,有一种被称为 Simula 的语言,顾名思义,它可能是一种主要为仿真而设计的语言。Simula 67 语言是 Stroustrup 使用的变体,被认为是支持面向对象编程范例的主要语言。Stroustrup 发现这种范例对包装开发很有帮助。但是,Simula 语言对于实践和实际使用而言太慢了。 随后不久,Bjarne Stroustrup 希望通过支持面向对象范例来增强 C。他深入研究了 Smalltalk 的 OO 实现,以获取有关实现的想法。但是他不愿意为此放弃性能,因此他开始从事 “C with Classes (带有类的 C)” 的工作,希望 C++ 代码运行时应具有与 C 代码相似(或更好)的性能。
|
||
- **1983 年**,语言的名称从 “带有类的 C” 更改为 C++。C 语言中的 ++ 运算符是用于递增变量的运算符,它使您可以深入了解 Stroustrup 如何看待该语言。在此期间添加了许多新功能,其中最引人注目的是虚函数,函数重载,带有&符号的引用,const 关键字和使用两个正斜杠的单行注释。
|
||
- **1985 年**,Stroustrup 出版了名为*“C++ 编程语言” 的书籍*。同年,C++ 被实现为商业产品。该语言尚未正式标准化,因此使该书成为非常重要的参考。该语言在 1989 年再次进行了更新,以包括受保护的成员和静态成员,以及从多个类的继承。
|
||
- **1990 年**,发行了*《带注释的 C++ 参考手册*》。同年,Borland 的 Turbo C++ 编译器将作为商业产品发布。Turbo C++ 添加了许多其他库,这些库会对 C++ 的开发产生相当大的影响。尽管 Turbo C++ 的最后一个稳定版本是 2006 年,但该编译器仍被广泛使用。
|
||
- **1998 年**,C++ 标准委员会发布了第一个 C++ ISO / IEC 14882:1998 国际标准,其非正式名称为 C++ 98。据说*《带注释的 C++ 参考手册*》对标准的制定产生了很大的影响。还包括标准模板库,该模板库于 1979 年开始概念开发。2003 年,该委员会对 1998 年标准所报告的多个问题做出了回应,并对其进行了相应的修订。更改的语言称为 C++ 03。
|
||
- **2005 年**,C++ 标准委员会发布了一份技术报告(称为 TR1),详细介绍了他们计划添加到最新 C++ 标准中的各种功能。新标准被非正式地称为 C++ 0x,因为它有望在第一个十年结束之前的某个时间发布。具有讽刺意味的是,新标准要到 2011 年年中才会发布。直到那时为止,已经发布了几份技术报告,并且一些编译器开始为新功能添加实验性支持。
|
||
- **2011 年中**,新的 C++ 标准(称为 C++ 11)完成。Boost 库项目对新标准产生了重大影响,其中一些新模块直接来自相应的 Boost 库。一些新功能包括正则表达式支持,全面的随机化库,新的 C++ 时间库,原子支持,标准线程库 ,一种新的 for 循环语法,提供的功能类似于某些其他语言中的 foreach 循环,auto 关键字,新的容器类,对联合和数组初始化列表以及可变参数模板的更好支持。
|
||
- **2014 年**,C++ 14(也称为 C++ 1y)作为 C++11 的一个小扩展发布,主要功能是错误修复和小的改进,国际标准投票程序草案于 2014 年 8 月中完成,加强 lambda 函数,constexpr 和类型推导特性。
|
||
- **2017 年**,发布 C17 标准,C17 提供了很多东西。增强了核心语言和库。
|
||
- **2020 年**,发布 C++20 标准,推出了很多重量级功能,其中比较重要的有:
|
||
- Concepts:概念改变了我们思考和编程模板的方式。它们是模板参数的语义类别。它们使您可以直接在类型系统中表达您的意图。如果出了什么问题,您会收到清晰的错误消息。
|
||
- Ranges library:新的 ranges 库使它可以直接在容器上执行算法,用管道符号组成算法,并将其应用于无限数据流。
|
||
- Coroutines:由于协程,C++ 中的异步编程成为主流。协程是协作任务,事件循环,无限数据流或管道的基础。
|
||
- Modules:模块克服了头文件的限制。头文件和源文件的分离变得和预处理器一样过时了。最后,我们有更快的构建时间和更轻松的构建软件包的方法。
|
||
- Concurrency:Atomic Smart Pointers,Joining & Cancellable Threads,The C20 Synchronization Library,增强了 C++ 并发编程能力;
|
||
|
||
### 面向对象
|
||
|
||
C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:
|
||
|
||
- 封装
|
||
- 抽象
|
||
- 继承
|
||
- 多态
|
||
|
||
### 标准库
|
||
|
||
标准的 C++ 由三个重要部分组成:
|
||
|
||
- 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
|
||
- C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
|
||
- 标准模板库(STL),提供了大量的方法,用于操作数据结构等。
|
||
|
||
## 实例
|
||
|
||
```cpp
|
||
// 输出单词 Hello World
|
||
#include <iostream>
|
||
using namespace std;
|
||
|
||
// main() 是程序开始执行的地方
|
||
int main(){
|
||
// 输出 Hello World
|
||
cout << "Hello World";
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
1. C++ 语言定义了一些头文件,这些头文件包含了程序中必需的或有用的信息。上面这段程序中,包含了头文件
|
||
|
||
2. 行 **using namespace std;** 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
|
||
|
||
3. **// main() 是程序开始执行的地方** 是一个单行注释。单行注释以 // 开头,在行末结束。
|
||
|
||
4. **int main()** 是主函数,程序从这里开始执行。
|
||
|
||
5. **cout << "Hello World";** 会在屏幕上显示消息 "Hello World"。
|
||
|
||
6. **return 0;** 终止 main( )函数,并向调用进程返回值 0。
|
||
|
||
### g++ 编译器
|
||
|
||
程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示:
|
||
|
||
```cpp
|
||
$ gcc main.cpp -lstdc++ -o main
|
||
```
|
||
|
||
下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码:
|
||
|
||
```cpp
|
||
#include <iostream>using namespace std;int main(){
|
||
cout << "Hello, world!" << endl;
|
||
return 0;}
|
||
```
|
||
|
||
最简单的编译方式:
|
||
|
||
```cpp
|
||
$ g++ helloworld.cpp
|
||
```
|
||
|
||
由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行:
|
||
|
||
```cpp
|
||
$ ./a.outHello, world!
|
||
```
|
||
|
||
通常我们使用 **-o** 选项指定可执行程序的文件名,以下实例生成一个 helloworld 的可执行文件:
|
||
|
||
```cpp
|
||
$ g++ helloworld.cpp -o helloworld
|
||
```
|
||
|
||
执行 helloworld:
|
||
|
||
```cpp
|
||
$ ./helloworldHello, world!
|
||
```
|
||
|
||
如果是多个 C++ 代码文件,如 runoob1.cpp、runoob2.cpp,编译命令如下:
|
||
|
||
```cpp
|
||
$ g++ runoob1.cpp cpp、runoob2.cpp -o runoob
|
||
```
|
||
|
||
生成一个 runoob 可执行文件。
|
||
|
||
g++ 有些系统默认是使用 C++98,我们可以指定使用 C++11 来编译 main.cpp 文件:
|
||
|
||
```cpp
|
||
g++ -g -Wall -std=c++11 main.cpp
|
||
```
|
||
|
||
**常用命令选项**
|
||
|
||
| 选项 | 解释 |
|
||
| ------------ | ------------------------------------------------------------ |
|
||
| -ansi | 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 |
|
||
| -c | 只编译并生成目标文件。 |
|
||
| -DMACRO | 以字符串"1"定义 MACRO 宏。 |
|
||
| -DMACRO=DEFN | 以字符串"DEFN"定义 MACRO 宏。 |
|
||
| -E | 只运行 C 预编译器。 |
|
||
| -g | 生成调试信息。GNU 调试器可利用该信息。 |
|
||
| -IDIRECTORY | 指定额外的头文件搜索路径DIRECTORY。 |
|
||
| -LDIRECTORY | 指定额外的函数库搜索路径DIRECTORY。 |
|
||
| -lLIBRARY | 连接时搜索指定的函数库LIBRARY。 |
|
||
| -m486 | 针对 486 进行代码优化。 |
|
||
| -o | FILE 生成指定的输出文件。用在生成可执行文件时。 |
|
||
| -O0 | 不进行优化处理。 |
|
||
| -O | 或 -O1 优化生成代码。 |
|
||
| -O2 | 进一步优化。 |
|
||
| -O3 | 比 -O2 更进一步优化,包括 inline 函数。 |
|
||
| -shared | 生成共享目标文件。通常用在建立共享库时。 |
|
||
| -static | 禁止使用共享连接。 |
|
||
| -UMACRO | 取消对 MACRO 宏的定义。 |
|
||
| -w | 不生成任何警告信息。 |
|
||
| -Wall | 生成所有警告信息。 |
|