第一章 致读者
1.1 本书结构
1.1.1 例子和参考
1.1.2 练习
1.1.3 有关实现的注记
1.2 学习C++
在学习C++时,最重要的是集中关注概念,不要迷失在语言的细节中。更多关注接口,
而不是实现。
C++支持多种程序设计风格,所有这些的基础是强类型检查,大部分的的目标是要获得
一种高层次的抽象,以直接表达程序员的思想。
强/弱类型是指类型检查的严格程度的。语言有无类型,弱类型和强类型三种。无类型的不检查,甚至不区分指令和数据。弱类型的检查很弱,仅能严格的区分指令和数据。强类型的则严格的在编译期进行检查,所有变量必须指定类型。
最好的方式是直接学习C++,C++更安全,表达能力更强,而且减少了关心低级技术的需要。学习C++,不要注重他是从C发展而来,更主要的是他从其他面向对象语言发展而来,因为学习C++的首要目的是支持面向对象设计,而不是结构化程序设计。
1.3 C++的设计
在C++设计中,极力避免即使不用也会带来运行时间或空间额外开销的特征。
C++的类型检查和数据隐藏特征依赖于编译时对程序的分析,以防止因为意外而破坏数
据的情况。这只是逻辑上的,而不是提供系统安全性或防止有意的打破这些规则。
1.3.1 效率和结构
知道了对象的类型,编译器就能检查错误。使用类型系统去检查函数的参数,去保护数
据不被意外的破坏,去提供新的类型,去提供新的操作,如此等等,都没有增加任何运行中的时间和空间开销。Fyhui问:类型在程序—编译器—汇编—内存位—栈或寄存器中怎么体现的?
1.3.2 哲学的注记
1.4 历史注记
附录B 早期、C和C++差异
C++的最初基本语法是来源于C,保留C的功能,使其能在足够低的层次上处理最苛刻的系统程序设计工作。
C++另一个主要来源是Simula76类的概念。
C++运算符重载和自由地声明放置参考Algol68。
C++模板机制和异常处理机制受Ada启发。
1.5 C++的使用
1.6 C和C++
1.6.1 给C程序员的建议
C++存在比C更好的方式:
[1]在C++里,几乎不要用到宏。用const或enum定义明显的常量,用inline避免函数调用额外的开销,用template去刻画一族函数或者类型,用namespace去避免名字冲突。
[2]在需要使用时,才开始声明变量。这样更清楚变量的意义。
[3]不要用malloc(),new运算符能做的更好。对于realloc(),请试试vector()。
[4]试着去避免*void、指针算术、联合和强制,除了在某些函数和类的深层之外,大部分情况下,强制是设计错误的指示器。如果必须用强制类型转换,请使用C++类型转换。
[5]尽量少使用数组和C风格的字符串,使用C++标准库的string和vector常常可以简化程序设计。
最重要的是,试着将程序考虑为一组由类和对象表示的相互作用的概念,而不是一堆数
据结构和一些去拨弄结构中二进制位的函数。
1.6.2 给C++程序员的建议
1.7 有关C++里编程的思考
类之间通过函数对象或对象的方法访问,而不是通过对象的变量。
有些概念具有内在的相互依赖,请设法将这种循环依赖局部化,使它们不影响程序的整
体结构。解开依赖图的一种最好的工具就是界面和实现清晰的分离。抽象类是C++处理这种问题的工具。
共性的另一种形式是模板。
“了解你想说什么?” “实践,模仿好的作品。”
1.8 忠告
要写出一个好的作品,需要智慧、品味和耐性。
[1]在编程时,你是在为你针对的某个问题的解决方案中的思想建立起一种具体表示。让程序的结构尽可能的直接反映这些思想:
[a]如果你能把它看成一个独立的概念,就把它做成一个类。
[b]如果你能把它作为一个独立的实体,就把它做成某个类的一个对象。
[c]如果两个类有共同的接口,将此接口做成一个抽象类。
[d]如果两个类的实现有某些显著共同的东西,将这些共性做成一个基类。
[e]如果一个类是一种对象的容器,将它做成一个模板。
[f]如果一个函数实现对某容器的一个算法,将它实现为对一类容器可用的模板函数。
[g]如果一组类、模板等互相之间有逻辑联系,将它们放进一个名字空间里。
[2]在你定义一个并不是像矩阵或复数这样的数学对象的类时,或者定义一个低层的类型如链表时:
[a]不要使用全局数据(使用成员)。
[b]不要使用全局函数。
[c]不要使用公用数据成员。
[d]不要使用友元,除非为了避免[a]或[c]。
[e]不要在一个类里放类型域,采用虚函数。
[f]不要使用内联函数,除非作为效果的显著的优化。
1.9 参考文献