枚举类型
枚举[enumeration],不但定义了整数常量,而且还把它们组,成一个集合。例如
enum open_modes{ input = 1, output, append };
open_modes 是一个枚举类型,每个被命名的枚举定义了一个唯一的类型,它可以被用作类型标识符。例如
void open_file( string file_name, open_modes om );
input, output 和 append是枚举成员[enumerator]。它们代表了能用来初始化和赋值 open_modes 类型变量的值的全集。例如
open_file( "Phoenix and the Crane", append );
如果我们试图向open_file()传递一个input,output,append 之外的值 就会产生编译错误
(限制传递给函数的值只能是input,output 和append 之一)
我们也可以显式地把一个值赋给一个枚举成员 这个值不必是唯一的
// point2d == 2, point2w == 3, point3d == 3, point3w == 4
enum Points { point2d = 2, point2w, point3d = 3, point3w };
可以定义枚举类型的对象,它可以参与表达式运算,也叫以被作为参数传递给函数枚举类型的对象能够被初始化,但是只能被一个相同枚举类型的对象或枚举成员集中的某个值初始化或赋值。例如,虽然3是一个与Points 相关联的合法值,但是它不能被显式地赋给Points 类型的对象 。
void mumble() {
Points pt3d = point3d; // ok: pt3d == 3
// 错误 pt2w被初始化为一个 int整数
Points pt2w = 3;
// 错误 polygon不是 Points的枚举成员
pt2w = polygon;
// ok: pt2w和 pt3d都是 Points枚举类型
pt2w = pt3d;
}
关于数组初始化
非const 的变量不能被用来指定数组的维数 extern int get_size();
// buf_size和 max_files都是 const
const int buf_size = 512, max_files = 20;
int staff_size = 27;
// ok: const变量
char input_buffer[ buf_size ];
// ok 常量表达式 : 20 - 3
char *fileTable[ max_files - 3 ];
// 错误 : 非 const变量
double salaries[ staff_size ];
// 错误 非 const表达式
int test_scores[ get_size() ];
虽然staff_size 被一个文字常量初始化 但是staff_size 本身是一个非const 对象 系统只能在运行时刻访问它的值 因此 它作为数组维数是非法的
字符数组可以用一个由逗号分开的字符文字列表初始化,文字列表用花括号括起来,或者用一个字符串文字初始化。但是,注意这两种形式不是等价的,字符串常量包含一个额外的终止空字符 例如
const char ca1[] = { 'C', '+', '+' };
const char ca2[] = "C++";
cal 的维数是3 ca2 的维数是4 下面的声明将被标记为错误
// 错误 : "Daniel"是 7个元素
const char ch3[ 6 ] = "Daniel";
一个数组不能被另外一个数组初始化,也不能被赋值给另外一个数组,而且 C++ 不允许声明一个引用数组(即由引用组成的数组)
// ok: 类型为 int*的指针的数组
int *iap [] = { &ix, &jx, &kx };
// 错误 : 不允许引用数组
int &iar[] = { ix, jx, kx };
// 错误 : 不能用另一个数组来初始化一个数组
int ia2[] = ia; // 错误
下面的定义只初始化了每行的第一个元素 其余的元素被初始化为0
int ia[ 4 ][ 3 ] = { {0}, {3}, {6}, {9} };
给通用的函传递一对指向任意类型数组的指针,这种程序设计形式被称为泛型程序设计[generic programming]。它们通过一对标记元素范围的开始/结束指针来遍历其中的元素 例如 我们可以如下调用泛型算法sort()
#include <algorithm>
int main()
{
int ia[6] = { 107, 28, 3, 47, 104, 76 };
string sa[3] = { "piglet", "eeyore", "pooh" };
sort( ia, ia+6 );
sort( sa, sa+3 );
}
与内置数组不同, vector 可以被另一个vector 初始化 或被赋给另一个vector。例如
vector< string > svec;
void init_and_assign()
{
// 用另一个 vector初始化一个 vector
vector< string > user_names( svec );
// ...
// 把一个 vector拷贝给另一个 vector
svec = user_names;
}