EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

C++ 高级程序设计-00-C++ 历史

目的

更高效地进行编码

设计理念

  1. 效率
  2. 实用性优于艺术性严谨性
  3. 允许一个有用的特征比防止各种错误使用更重要(相信程序员)

重要人物

成就
John Backus 发明了 FORTRAN,使得编程更贴近于问题本身
Dijkstra 发明了编译器,提出 goto 有害论,创建了结构化编程
Kristen Nygaard 创建 Simula67
Ole-Johan Dahl 创建 OO 编程
Dennis Ritchie、Ken Thompson 创建 C 语言
Bjarne Stroustrup 1980 创建 C with Classes,并最终形成 C++
Rick Mascitti 发明 C++,并 1983 正式命名
Barbara Liskov 关于高层复用做出很大的贡献

三条主要脉络

C++脉络

脉络一:Algol 68 结构化编程的部分的继承

  1. Niklaus Wirth[瑞士]:发明了 PASCAL,适用于教学
  2. Donald E.Knuth[高德纳]:与 Dijkstra 一同提 goto 有害性

高德纳的中文名字是姚期智的妻子储枫起的。高德纳还是《The Art of Computer Programming》的作者。高德纳与葛立恒合著《具体数学》。葛立恒妻子金芳荣(安徽全椒人)是中国台湾组合数学家。

C++ 继承了关于结构化编程的特性

脉络二:系统化编程的继承

  1. BCPL:贴近计算机,写出高效的程序,将 IO 作为类成分而不是语言成分,以提高语言可移植性
  2. Ken Thompson[美国,ken]:发明 B 语言
  3. Dennis Ritchie[美国,dmr]:发明 C 语言

Ken Thompson 在黑客圈被称为 ken,Dennis Ritchie 则被称为 dmr。

Dennis Ritchie 是 《C Programming Language》的作者之一。

C++ 继承了关于系统编程的特性

脉络三:OO 部分的继承

  1. Kristen Nygaard[挪威]:发明 Simula67
  2. Ole-Johan Dahl[挪威]:最先提出 OO
  3. Barbara Liskov[美国,女]:关于高层复用做出很大的贡献

C++ 继承了关于面向对象编程的特性

C 与 C++ 的关系

  1. 代码层面:C++ 完全包含了 C 语言成分,支持 C 支持的全部编程技巧,C 是建立 C++ 的基础,同时 C++ 还添加了 OOP 的完全支持。
  2. 运行:任何 C 程序都能被 C++ 用基本相同的方法编写,并具有相同的运行效率和空间。
  3. 功能:C++ 还引入了重载、内联函数、异常处理等功能,对 C 中过程化控制及其功能并扩充。

为什么不叫 D 语言

因为并没有完全抛弃 C 中的很多东西。而且事实上的确有一门 D 语言,但是并没有什么人用。C 与 C++已经被无数应用所验证,仍具有顽强的生命力,将其全盘抛弃后新开一门语言是不划算的。

C++ 编译与链接过程

C++ 源代码想通过 cpp 预处理后再通过 Cfront 翻译成 C 语言,最后通过 C 编译器来使程序运行。

用 Cfront 不用 Cpre 的原因:Cpre 不懂 C 语法,Cfront 懂,发现语法错误会传回源代码,但 Cpre 将方言部分翻译成 C 后交给 cc,此时若发现错误才传回源代码

C 和 C++ 混合编程应该注意的问题

  1. 名变换:如果调用 C 语言库中的函数,则需要附加 "extern C",限制 C++ 编译器进行名变换,便于可以连接
  2. 静态初始化:C++ 静态的类对象和定义在全局的、命名空间中的或文件体中的类对象的构造函数通常在 main 被执行前就被调用;尽可能把主函数写在 cpp 文件当中
  3. 内存动态分配:C++ 使用 new/delete,C 使用 malloc/free,需要注意匹配
  4. 数据结构兼容:将在两种语言间传递的东西限制在用 C 编译的数据结构的范围内;这些结构的 C++ 版本可以包含非虚成员函数,不能有虚函数。
  5. C 语言不支持函数重载。

在 C++ 中 f(int, int)f(int, double) 是不同的函数,都重载了函数 f();但是在 C 语言中却被认为是相同的函数。因为在编译时,C 语言给这几个函数的命名为 f_;而 C++ 命名分别为 f_int_intf_int_doublef_,以表示区别;所以混合编程时应注意重载函数的问题;

  1. 在 C++ 中也允许在 structunion 中定义函数,他们也具有类的基本功能,与 class 所不同的是,structunion 的成员的默认访问控制为 public