《C++ Primer Plus》读书笔记 第一章 预备知识

127 阅读8分钟

C++继承了C语言高效、简洁、快速和可移植性的传统。C++的面向对象特性带来了面向对象的编程方法。C++的模板特性提供了泛型编程的编程方法。

C++简介

  • C++融合了3种不同的编程方式:C语言代表的过程性语言、C++在C语言基础上添加的类代表的面向对象语言、C++模板支持的泛型编程
  • 如果不了解C语言,则学习C++时需要掌握C语言的知识、OOP知识以及泛型编程知识,但无需摈弃任何编程习惯。

C++简史

C语言

  • 20世纪70年代早期,贝尔实验室的Dennis Ritchie致力于开发UNIX操作系统。为完成这项工作,Ritchie需要一种语言,它必须简洁,能够生成简洁、快速的程序,并能有效地控制硬件。
  • UNIX是为在不同的计算机(或平台)上工作而设计的,这意味着它是一种高级语言。
  • 高级(high-level)语言致力于解决问题,而不针对特定的硬件。一种被称为编译器的特殊程序将高级语言翻译成特定计算机的内部语言。这样,就可以通过对每个平台使用不同的编译器来在不同的平台上使用同一个高级语言程序了。
  • Ritchie希望有一种语言能将低级语言的效率、硬件访问能力和高级语言的通用性、可移植性融合在一起,于是他在旧语言的基础上开发了C语言

C语言编程原理

  • 计算机语言要处理两个概念——数据和算法。数据是程序使用和处理的信息,而算法是程序使用的方法。
  • C语言是过程性(procedural)语言,强调的是编程的算法方面。
  • C语言具有结构化编程(structured programming)的方法特性。包涵了for循环、while循环、do while循环和if else语句这些结构。
  • C语言经常采用自顶向下(top-down)的设计原则。其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则将它分解为更小的任务。

面向对象编程

  • OOP强调的是数据而不是算法方面。其理念是设计与问题的本质特性相对应的数据格式
  • 类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。
  • 类规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。
  • OOP经常采用自下向上(bottom-up)的编程过程。首先设计类,它们准确地表示了程序要处理的东西,然后可以设计一个使用这些类的对象的程序,从低级组织(如类)到高级组织(如程序)。
  • 有助于创建可重用的代码。
  • 信息隐藏可以保护数据,使其免遭不适当的访问。
  • 多态能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。
  • 继承能够使用旧类派生出新类。

C++和泛型编程

  • 泛型编程(generic programming)与OOP的目标相同,即使重用代码和抽象通用概念的技术更简单。
  • OOP强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型。
  • OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务(如对数据排序或合并链表)的工具。
  • 术语泛型(generic)指的是创建独立于类型的代码。

C++的起源

  • C++由贝尔实验室的Bjarne Stroustrup于20世纪80年代开发。
  • C++在C的基础上创建,OOP方面是受到了计算机模拟语言Simula67的启发。后来添加的模板特性使得进行泛型编程成为可能。
  • C++是C语言的超集,任何有效的C程序都是有效的C++程序。它们之间有些细微的差异,但无足轻重。
  • OOP部分赋予了C++语言将问题所涉及的概念联系起来的能力,C部分则赋予了C++语言紧密联系硬件的能力。

可移植性和标准

如果在不修改代码的情况下,重新编译程序后,程序将运行良好,则该程序是可移植的。在可移植性方面存在两个障碍,其中的一个是硬件。硬件特定的程序是不可移植的。可移植性的第二个障碍是语言上的差异。美国国家标准局(American National Standards Institute,ANSI)在1990年设立了一个委员会(ANSI X3J16),专门负责制定C++标准(ANSI制定了C语言标准)。国际标准化组织(ISO)很快通过自己的委员会(ISO-WG-21)加入了这个行列,创建了联合组织ANSI/ISO,致力于制定C++标准。

C++的发展

早期的标准化

  • C++98: 这是第一个正式的C++国际标准。它定义了核心语言特性,并引入了标准模板库(STL),包括容器(vector、list)、算法和迭代器等,极大地提升了C++的编程效率和可移植性。
  • C++03: 这个版本是对C++98的一个小的技术性修订,主要修复了一些Bug和澄清了一些定义,没有引入大的新特性。

现代C++的崛起(三年一版)

  • C++11: 这是一个革命性的版本,引入了大量重要的新特性,彻底改变了C++的编程范式。主要包括:
    • Lambda表达式: 实现了匿名函数,使函数式编程成为可能。
    • 自动类型推断auto): 简化了变量声明,减少了冗长的类型名。
    • 右值引用(Rvalue reference)和移动语义(Move semantics): 提高了资源的转移效率,尤其是在处理大型对象时。
    • 智能指针shared_ptr、unique_ptr): 自动管理内存,有效避免了内存泄漏。
    • 多线程库: 提供了标准化的多线程支持,使并行编程更加容易。
  • C++14: 作为C++11的一个小型增量版本,C++14主要改进和完善了C++11的特性。
    • 泛型Lambda: Lambda表达式可以使用auto关键字作为参数类型。
    • 变量模板: 允许模板应用于变量声明。
  • C++17: 再次引入了许多有用的新特性,简化了代码。
    • 结构化绑定(Structured bindings): 可以一次性解构并绑定结构体、元组等对象的成员。
    • 内联变量(Inline variables): 解决了跨单元声明和定义变量的重复问题。
    • if constexpr: 编译期条件分支,可以根据模板参数在编译时选择不同的代码路径。
  • C++20: 这是一个里程碑式的版本,带来了许多强大的新工具,尤其是对泛型编程的重大增强。
    • Concepts(概念): 为模板提供了约束,可以更清晰地表达模板参数的需求,并提供更好的错误信息。
    • Modules(模块): 旨在取代传统的头文件机制,可以加快编译速度并解决头文件依赖问题。
    • Coroutines(协程): 提供了一种新的函数类型,用于支持异步编程和并发。
    • Ranges(范围库): 极大地简化了对容器和序列的操作,使代码更加简洁、可读。
  • C++23: 目前最新的标准,主要对现有特性进行改进和补充,并带来了一些新的小特性,例如对模块和协程的进一步完善。

程序创建的技巧

创建C++程序的步骤:

  1. 使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码。
  2. 编译源代码。这意味着运行一个程序,将源代码翻译为主机使用的内部语言——机器语言。包含了翻译后的程序的文件就是程序的目标代码(object code)。
  3. 将目标代码与其他代码链接起来。

创建源代码文件

  • 可以使用任何文本编辑器来创建和修改源代码。
  • 给源文件命名时,必须使用正确的后缀,将文件标识为C++文件。这不仅告诉您该文件是C++源代码,还将这种信息告知编译器。
  • 常见源代码文件扩展名。 在这里插入图片描述

编译和链接

  • UNIX计算机中可以使用CC命令来编译。
  • Linux系统中最常用的编译器是g++。
  • Windows可以使用Microsoft Visual C++。
  • Apple随操作系统Mac OS X提供了开发框架Xcode。