目的
更高效地进行编码
设计理念
- 效率
- 实用性优于艺术性严谨性
- 允许一个有用的特征比防止各种错误使用更重要(相信程序员)
重要人物
人 | 成就 |
---|---|
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 | 关于高层复用做出很大的贡献 |
三条主要脉络
脉络一:Algol 68 结构化编程的部分的继承
- Niklaus Wirth[瑞士]:发明了 PASCAL,适用于教学
- Donald E.Knuth[高德纳]:与 Dijkstra 一同提 goto 有害性
高德纳的中文名字是姚期智的妻子储枫起的。高德纳还是《The Art of Computer Programming》的作者。高德纳与葛立恒合著《具体数学》。葛立恒妻子金芳荣(安徽全椒人)是中国台湾组合数学家。
C++ 继承了关于结构化编程的特性
脉络二:系统化编程的继承
- BCPL:贴近计算机,写出高效的程序,将 IO 作为类成分而不是语言成分,以提高语言可移植性
- Ken Thompson[美国,ken]:发明 B 语言
- Dennis Ritchie[美国,dmr]:发明 C 语言
Ken Thompson 在黑客圈被称为 ken,Dennis Ritchie 则被称为 dmr。
Dennis Ritchie 是 《C Programming Language》的作者之一。
C++ 继承了关于系统编程的特性
脉络三:OO 部分的继承
- Kristen Nygaard[挪威]:发明 Simula67
- Ole-Johan Dahl[挪威]:最先提出 OO
- Barbara Liskov[美国,女]:关于高层复用做出很大的贡献
C++ 继承了关于面向对象编程的特性
C 与 C++ 的关系
- 代码层面:C++ 完全包含了 C 语言成分,支持 C 支持的全部编程技巧,C 是建立 C++ 的基础,同时 C++ 还添加了 OOP 的完全支持。
- 运行:任何 C 程序都能被 C++ 用基本相同的方法编写,并具有相同的运行效率和空间。
- 功能:C++ 还引入了重载、内联函数、异常处理等功能,对 C 中过程化控制及其功能并扩充。
为什么不叫 D 语言
因为并没有完全抛弃 C 中的很多东西。而且事实上的确有一门 D 语言,但是并没有什么人用。C 与 C++已经被无数应用所验证,仍具有顽强的生命力,将其全盘抛弃后新开一门语言是不划算的。
C++ 编译与链接过程
C++ 源代码想通过 cpp 预处理后再通过 Cfront 翻译成 C 语言,最后通过 C 编译器来使程序运行。
用 Cfront 不用 Cpre 的原因:Cpre 不懂 C 语法,Cfront 懂,发现语法错误会传回源代码,但 Cpre 将方言部分翻译成 C 后交给 cc,此时若发现错误才传回源代码
C 和 C++ 混合编程应该注意的问题
- 名变换:如果调用 C 语言库中的函数,则需要附加
"extern C"
,限制 C++ 编译器进行名变换,便于可以连接 - 静态初始化:C++ 静态的类对象和定义在全局的、命名空间中的或文件体中的类对象的构造函数通常在
main
被执行前就被调用;尽可能把主函数写在 cpp 文件当中 - 内存动态分配:C++ 使用
new/delete
,C 使用malloc/free
,需要注意匹配 - 数据结构兼容:将在两种语言间传递的东西限制在用 C 编译的数据结构的范围内;这些结构的 C++ 版本可以包含非虚成员函数,不能有虚函数。
- C 语言不支持函数重载。
在 C++ 中
f(int, int)
与f(int, double)
是不同的函数,都重载了函数f()
;但是在 C 语言中却被认为是相同的函数。因为在编译时,C 语言给这几个函数的命名为f_
;而 C++ 命名分别为f_int_int
、f_int_double
、f_
,以表示区别;所以混合编程时应注意重载函数的问题;
- 在 C++ 中也允许在
struct
和union
中定义函数,他们也具有类的基本功能,与class
所不同的是,struct
和union
的成员的默认访问控制为public