2.4面向对象的程序设计
面向对象的程序设计方法正是为我们提供了这样一种能力。基类(base class)可由继承(inheritance)提供。当一个IntArrayRC类(也就是一个带有范围检查的IntArray类)继承了IntArray类时,称其为派生类(derived class),他就可以访问IntArray的数据成员和成员函数,而不需要同时维护两份代码拷贝。新的类只需要提供实现其语意所必需的数据成员和成员函数。
在基类对象的程序设计中,通常类的提供者只有一个,但是类的用户有许多个。提供者设计并且通常会实现类。用户使用提供者的公有接口,行为的分离可通过将类分成公有与私有访问级别而反映出来。
在构造函数中由冒号分割出来的部分称为成员函数初始化列表(member initialization list),它提供了一种机制,可以向基类IntArry的构造函数传递参数。而子类的构造函数可以为空的,因为它的工作就是把参数传递给相关的基类构造函数。不用再提供显示的子类析构函数,因为派生类没有引入任何需要析构的数据成员。
2.5泛型设计
C++模板设施提供了一种机制,它能够将类成员函数定义内部的类型和值参数化(parameterizing)。这些参数在其他方面不变的代码中用作占位符,以后,这些参数会被绑定到实际类型上,可能是内置的类型,也可能是用户定义的类型。
备注:
C++用模板来实现泛型编程,模板分为函数模板和类模板。
基本概念:泛型编程范式GP:模板也叫参数类型多态化。泛型在编译时期确定,相比面向对象的虚函数多态,能够有更高的效率。泛型编程是从一个抽象层面描述一种类型的算法,不管容器类型是什么,是一种不同于OOP的角度来抽象具体算法。C++0X目前对GP的支持的趋势来看,确实如此,auto/varadic templates这些特性的加入象征着C++ GP的形式正越来越转向一种更纯粹的泛性语法描述。GP的一个主要的弱点就是它不是二进制可复用的,源码基本是公开的,因为编译时候才决定具体类型,决定了类型后就不能更改了不像OOP一样拥有关闭开放的原则。
2.6基于异常的设计
异常处理为“响应运行时刻的程序异常”提供了一个标准的语言级的设施,他支持统一的语法风格,也允许每个程序员进行调试。异常处理使得我们需要在程序中处处显式地测试异常状态,从而可以将测试异常状态的代码抽取出来,放入指定的、显式标记的代码块中,因此异常处理设施大大地减少了程序代码的长度和复杂度。
异常处理机制主要构成如下:
- 程序中异常出现的点。
- 程序中异常被处理的点。
2.7用其他名字来命名数组
在c++标准化之前,解决命名的重复问题,传统的做法就是在全局可见的名字上加一个唯一的字符串前缀。C++解决此问题的方法是:提供了语言一级的解决方案,名字空间机制是C++语言正对这个问题提供的语言一级的解决方案。名字空间机制允许我们封装名字,否则这些名字就有可能会污染(或被影响)全局名字空间(pollute the global namespace)。关键字namespace后面的名字标示了一个名字空间,它独立于全局名字空间,我们可以在里面放一些希望声明在函数或类之外的实体。之后可以通过限定修饰符(qualified name notation)来调用不同空间里的相同名称的函数。
2.8标准数组—向量
定义一个包含10个整形对象的向量和一个包含10个字符串对象的向量。
Eg:
vector<int> ivec(10);
vetctor<string> svec(10);
要定义一个向量,必须包含相关头文件。 通过使用迭代器(iteratoor pair)来标记起始于结束位置
Eg:
#include<vector>
#include<iostram>
using namespace std;
int main()
{
int size = getSize();
vector<int> vec(size);
vector<int>::iterator iter = vec.begin();
for(int ix = 0;iter<vec.begin();++ix)
*iter = ix;
//…
reutn 0;
}
vector库中提供的泛型算法:
- 搜索(search)算法:find()、find_if()、binary_search()、count()、count_if()。
- 分类(sorting)排序与通用(ordering)排序算法:sort()、partial_sort()、merge()、partition()、rotate()、reverse()、random_shuffle()。
- 删除(deletion)算法:unique()和remove()
- 算数(numeric)算法:accumulate()、partial_sum()、inner_product()、adjacent_difference()
- 生成(generation)和变异(mutation)算法:generate()、fill()、transformation()、copy()、for_each()。
- 关系(relational)算法:equal()、min()和max()。