nd; // 下限, 上限
vector<t> data; // 数组内容; 关于vector,
// 请参见条款49
boundscheckingstatus checkingbounds;
};
目前为止声明的成员函数是基本上不用想(或深思,沉思)就该声明的。一个允许用户确定每个数组上下限的构造函数,一个拷贝构造函数,一个赋值运算符和一个析构函数。析构函数被声明为非虚拟的,意味着这个类将不作为基类使用(见条款14)。
对于赋值运算符的声明,第一眼看上去会觉得目的不那么明确。毕竟,c++中固定类型的数组是不允许赋值的,所以好象也应该不允许array对象赋值(参见条款27)。但另一方面,数组似的vector模板(存在于标准库——参见条款49)允许vector对象间赋值。在本例中,决定遵循vector的规定,正如下面将会看到的,这个决定将影响到类的接口的其他部分。
老的c程序员看到这个接口会被吓退:怎么竟然不支持固定大小的数组声明?很容易增加一个构造函数来实现啊:
array(int size,
boundscheckingstatus check = no_check_bounds);
但这就不能成为最小接口了,因为带上下限参数的那个构造函数可以完成同样的事。尽管如此,出于某些目的去迎合那些老程序员们的需要也可能是明智的,特别是出于和基本语言(c语言)一致的考虑。
还需要哪些函数?对于一个完整的接口来说当然还需要对数组的索引:
// 返回可以读/写的元素
t& operator[](int i