1
0
wiki/docs/开发/C++/简介.md

182 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 | C++17 | 第五个C++标准 |
| 2017 | coroutines TS | 协程库扩展 |
| 2017 | ranges TS | 提供范围机制 |
| 2017 | library fundamentals TS | 标准库扩展 |
| 2016 | concurrency TS | 用于并发计算的扩展 |
| 2015 | concepts TS | 概念库,用于优化编译期信息 |
| 2015 | TM TS | 事务性内存操作 |
| 2015 | parallelism TS | 用于并行计算的扩展 |
| 2015 | filesystem TS | 文件系统 |
| 2014 | C++14 | 第四个C++标准 |
| 2011 | - | 十进制浮点数扩展 |
| 2011 | C++11 | 第三个C++标准 |
| 2010 | - | 数学函数扩展 |
| 2007 | C++TR1 | C++技术报告:库扩展 |
| 2006 | - | C++性能技术报告 |
| 2003 | C++03 | 第二个C++标准 |
| 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 148821998 国际标准,其非正式名称为 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模块克服了头文件的限制。头文件和源文件的分离变得和预处理器一样过时了。最后我们有更快的构建时间和更轻松的构建软件包的方法。
- ConcurrencyAtomic 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 cpprunoob2.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 | 生成所有警告信息。 |