TC++PL读书笔记1
第2章 C++概览
1、什么是C++
--更好的C
--支持数据抽象
--支持面向对象
--支持通用型程序设计(泛型?)
2、程序设计范型
技术只是相对而言的,不同语言支持不同风格的程序设计,只是说它在实现此风格时会比较方便,不支持这些风格的程序设计会要付出更大的努力。
C一样可以写出面向对象的程序,只是需要注意的地方更多,甚至会出奇的困难。
支持某一种范型,不仅需要支持它的语言功能,还需要在一些形式上更加细微的作出编译或运行时的检查
Bjarne对C++的设计如是说:设计C++就是为了支持数据抽象,面向对象的程序设计和通用型的程序设计,以及在这些风格约束下的传统的C程序设计技术。它从未有意要给用户强加某种特殊的程序设计风格
设计范型不是为语言特有的,CPP可以实现各种设计范型
3、过程式程序设计
过程式程序设计:确定你需要哪些过程,采用你能找到的最好的算法
3.1、变量和算术
3.2、检验和循环
3.3、指针和数组
4、模块程序设计
模块程序设计:确定你需要哪些模块,将程序分为模块,将数据隐藏在模块中
此范型也被称为数据隐藏原理
模块设计需要解决的几个主要问题,提供界面(接口),限定接口访问,保证元素的初始化。
常使用名字空间(NameSpace)去声明用户界面。
4.1、分别编译
最大限度的去进行模块化,用语言特征去逻辑的表示模块,通过头文件提供接口,从而实现不同的用户文件的互联。
4.2、异常处理
好的界面一定要有异常处理
5、数据抽象
5.1、定义类型的模块
例子Stack管理器的界面
namespace Stack
{
struct Rep;//在某个地方定义的堆栈布局
typedef Rep& stack;
stack create();
void destroy(stack s);
void push(stack s,char c);
char pop(stack s);
}
在代码中,把所有的界面封装起来,但是却不是最理想的,此时通过模板实现此用户定义类型,会达到较好的效果
5.2、用户定义类型
用户定义类型:确定你需要哪些类型,为每个类型徒工完整的一组操作。
抽象数据类型,例子:Complex的例子,运算符的重载。
5.3、具体类型
具体实现的数据类型于抽象类型相对,抽象类型的界面能够更完全的将用户和实现细节隔离
5.4、抽象类型
从模板到真正实现过程中,表示方式和用户界面 没有完全分离,反而变成其中程序片断包含的一个内容,此时需要放弃真正的局部 变量
virtual 的意思是“可以在今后由这个类派生的类里重新定义”
5.5、虚函数
一种虚函数映射常用的实现技术是:让编译器把一个virtual函数的名字转化为指向这些函数指针表的一个下标,这种表称为虚函数表。
6、面向对象程序设计
6.1具体问题
形状的问题
enum Kind{circle,triangle,square};
class Shape
{
kind k;
Point center;
Color color;
public:
void draw();
void ratate(int)
}
此定义出现问题,如果类型域增加,整个代码都需要进行变化,
新类型加入,可能需要修改旧代码,这样就导致可重用性过低。
6.2类层次结构
定义所有共同特征的类,将实现定义为virtual
面向对象程序设计范型:确定需要哪些类,为每一个类提供完整的一组操作,利用继承去明确的表示共性。
7、通用型程序设计
7.1、容器
任意类型的类型,可以使用模板,template
例子,将stack类型用template用一个模板参数取代特定的数据类型
模板是编译时的一种机制,他们的使用不引起额外的运行时的开销
7.2、通用型算法
C++标准库的容器类和非数值算法采用通过序列和通过迭代器操作序列的观念实现通用型算法
8、附言
C++只是一种语言,重要的是体会对其而言固有的和自然的风格,而不是其所有的语言特征。
9、忠告
1、不需要知道所有C++的技术细节之后才能写出好的程序
2、特别关注语言设计技术,而不是各种语言的特征。