第1章 预备知识
本章内容
- C语言和C++的发展历史和基本原理
- 过程性编程和面向对象编程
- C++是如何在C语言的基础上添加面向对象概念的
- C++是如何在C语言的基础上添加泛型编程概念的
- 编程语言标准
- 创建程序的技巧
1.1 C++简介
C++融合了3种不同的编程方式:
- C语言代表的过程性语言
- **C++**在C语言基础上添加的类代表的面向对象语言
- **C++**模板支持的泛型编程
C++语言合并了底层和高层特性,既适合底层系统编程,也适合高级应用编程。
1.2 C++简史
1.2.1 C语言
20世纪70年代早期,贝尔实验室的Dennis Ritchie致力于开发UNIX操作系统。为完成这项工作,Ritchie需要一种语言,它必须简洁,能够生成简洁、快速的程序,并能有效地控制硬件。
Ritchie希望有一种语言能将低级语言的效率、硬件访问能力和高级语言的通用性、可移植性融合在一起,于是他在旧语言的基础上开发了C语言。
1.2.2 C语言编程原理
C语言最初是过程性(procedural)语言,强调的是编程的算法方面。程序命令计算机按一系列流程生成特定的结果。
结构化编程:
- 将分支限制为一小组行为良好的结构
- C语言包含:for循环、while循环、do-while循环和if-else语句
自顶向下设计:
- 将大型程序分解成小型、便于管理的任务
- 如果其中的一项任务仍然过大,则将它分解为更小的任务
- 鼓励程序员开发程序单元(函数)来表示各个任务模块
1.2.3 面向对象编程(OOP)
OOP与强调算法的过程性编程不同,OOP强调的是数据。其理念是设计与问题的本质特性相对应的数据格式。
在C++中:
- 类:一种规范,描述了数据格式
- 对象:根据这种规范构造的特定数据结构
OOP的核心概念:
- 抽象:提取事物的本质特征
- 封装:隐藏实现细节
- 继承:从已有类派生新类
- 多态:同一接口支持不同实现
OOP编程方法:
- 首先设计类,准确地表示程序要处理的东西
- 从低级组织(如类)到高级组织(如程序)的处理过程叫做自下向上的编程
1.2.4 C++和泛型编程
泛型编程(generic programming)是C++支持的另一种编程模式。它与OOP的目标相同,即使重用代码和抽象通用概念的技术更简单。
- OOP强调的是编程的数据方面
- 泛型编程强调的是独立于特定数据类型
- C++模板提供了泛型编程的机制
1.2.5 C++的起源
C++在贝尔实验室诞生,Bjarne Stroustrup于20世纪80年代开发了这种语言。
关键点:
- C++主要是为了更方便地编写出好程序
- C++的OOP方面受到了计算机模拟语言Simula 67的启发
- C++是C语言的超集,任何有效的C程序都是有效的C++程序
- 名称C++来自C语言中的递增运算符++
1.3 可移植性和标准
1.3.1 C++的发展
| 时间 | 里程碑 |
|---|---|
| 1983 | C++正式命名 |
| 1985 | 第一本C++参考手册《The C++ Programming Language》 |
| 1990 | ANSI/ISO C++标准委员会成立 |
| 1994 | C++98标准草案发布 |
| 1998 | C++98/ISO标准发布(ISO/IEC 14882:1998) |
| 2003 | C++03标准发布(技术性修订) |
| 2011 | C++11标准发布(ISO/IEC 14882:2011) |
1.3.2 本书遵循的C++标准
本书基于 ISO/IEC 14882:2011(即C++11)标准编写。
C++11新增特性:
auto类型推断- 范围for循环
- Lambda表达式
- 智能指针
- 移动语义
nullptr
1.4 程序创建的技巧
1.4.1 创建源代码文件
C++源代码文件扩展名:
| C++实现 | 源代码文件的扩展名 |
|---|---|
| UNIX | C、CC、CXX、c |
| GNU C++ | C、cC、cxx、cpp、c++ |
| Digital Mars | cpp、cxx |
| Borland C++ | cpp |
| Watcom | cpp |
| Microsoft Visual C++ | cpp、cxx、cc |
| Freestyle CodeWarrior | cp、cpp、cC、cxx、c++ |
1.4.2 编译和链接
程序创建过程:
源代码 → 预处理 → 编译 → 汇编 → 链接 → 可执行文件| 阶段 | 说明 | 输入 → 输出 |
|---|---|---|
| 预处理 | 处理#开头的指令 | .cpp → .i |
| 编译 | 翻译为汇编语言 | .i → .s |
| 汇编 | 翻译为机器语言 | .s → .o |
| 链接 | 合并库和目标文件 | .o + 库 → 可执行文件 |
编译指令示例:
bash
# UNIX/Linux
g++ -o hello hello.cpp
# Windows (MinGW/Cygwin)
g++ great.cpp1.5 总结
- C++融合了C语言的过程性特性和OOP特性
- C++遵循ISO标准,C++11是本书重点
- 源代码需要经过编译和链接才能生成可执行程序
- 可移植性是C++的重要特性之一