设计类考虑的问题:
1) 保护成员(包括数据成员和成员函数)只提供给派生类使用;私有成员提供给友员类和类自己使用;
2) 对于类型相关的成员函数,它的算法由特定的基类或者派生类的行为或实现来决定,需要声明为virtual。
3) 如果派生类没有引入额外的数据成员,我们可以合理的假设继承基类的构造函数就已经足够了,我们不需要再提供派生类的构造函数,因为我们不需要它做任何事情。但是实际上,我们还是需要提供派生类的构造函数的。因为,基类的构造函数并没有被派生类继承(析构函数和拷贝赋值操作同样也没有),还因为我们需要某个接口,以便通过这个接口把必要的参数传递给某基类的构造函数。
例如下面是两个必需的IntArrayRC 构造函数
inline IntArrayRC::IntArrayRC( int sz)
: IntArray( sz ) {}
inline IntArrayRC::IntArrayRC( const int *iar, int sz )
: IntArray( iar, sz ) {}
由冒号分割出来的部分称作成员初始化列表member initialization list 它提供了一种机制。通过这种机制,我们可以向IntArray 的构造函数传递参数。两个IntArrayRC 构造函数的函数体都是空的,因为它们的工作就是把参数传递给相关的IntArray 构造函数。我们无需提供显式的IntArrayRC 析构函数,因为派生类没有引入任何需要析构的数据成员。继承过来的需要析构的IntArray 成员都由IntArray 的析构函数来处理。
静态对象是有名字的,动态对象是没有名字的。
由于C++不允许数据成员和成员函数共享同一个名字,所以在这种情况下,一般的习惯是在数据成员名字前面加一个下划线(-)
构造函数负责初始化类对象的数据成员,二不分配数据成员的内存。
构造函数和析构函数是程序员提供的函数,它们既不构造也不销毁类的对象(编译器自动将它们作用倒这些对象上)。因此,构造函数和析构函数这两个名字多少有些误导。
当我们写:
int mian()
{
IntArray myArray(1024);
//………
Return 0;
}
在构造函数被应用之前,用于维护myArray中数据成员的内存已经被分配了。实际上,编译器在内部把程序转换为如下的代码(注意这不是合法的C++代码)
Int main()
{
IntArray myArray;
myArray.IntArramy::IntArray(1024);
//………..
myArray.IntArray::~IntArray();
return 0;
}
类的构造函数主要用来初始化类对象的数据成员。析构函数主要负责释放类对象在生命周期内申请到的所有资源。
能够应用到向量上的操作惊人地多但是它们并不是作为vector 类模板的成员函数提供
的它们是以一个独立的泛型算法集的形式由标准库提供下面是一组可供使用的泛型算
法的示例
搜索search 算法find() find_if() search() 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()
泛型算法接受一对迭代器它们标记了要遍历元素的范围例
要使用这些算法我们必须包含与它们相关的头文件
#include <algorithm>