虽然C++对数组类型提供了内置支持,但是这种支持仅限于用来读写单个元素的机
制。C++不支持数组的抽象abstraction ,也不支持对整个数组的操作。我们有时会希望对
整个数组进行操作,例如:把一个数组赋值给另外一个数组,对两个数组进行相等比较或
者想知道数组的大小size。 例如:给出两个数组我们不能用赋值操作符把一个数组拷
贝到另一个中去
int array0[ 10 ], array1[ 10 ];
// 错误,不能直接把一个数组赋值给另一个数组
array0 = array1;
如果我们希望把一个数组赋值给另外一个,则必须自己写程序按顺序拷贝每个元素
for ( int index = 0; index < 10; ++index )
array0[ index ] = array1[ index ];
而且数组类型本身没有自我意识,它不知道自己的长度我们必须另外记录数组本身
的这些信息。当我们希望把数组作为一个参数传递给一个函数的时候,问题就出现了,在C++
中数组不同于整数类型和浮点数类型,它不是C++语言的一等first-class 公民。数组是
从C 语言中继承来的,它反映了数据与对其进行操作的算法的分离,而这正是过程化程序设
计的特征。
为什么内置数组类型不支持数组之间的赋值,支持这种操作需要什么信息?
因为数组名代表常量指针,所以数组之间的赋值就是把一个常量付给另一个常量。
常量指针”不等同于“常量”,所以后半句显然是不准确的。
C 数组在设计上采取了不保存数组的大小信息,这就导致了在运行时无法从数组对象上获取数组的大小;如果没有数组的大小信息,数组对象的值就无从获得、相应地数组的拷贝操作按照常规(即一般对象的赋值方式)也是不能完成的(这其实是 C 数组如此设计要达到的目的)。
虽然数组对象是一个左值,但是由于缺乏数组对象的大小信息,所以在程序运行时无法获得这个对象的值,当然也就无法直接使用数组的值。然而,C 中的任何对象都是有值属性的,数组对象也应该不能例外——于是就有了这样一条规定:除了作为 sizeof 和 & 运算符的操作数之外,数组转换(转换是一种运算,由编译器自动进行)为指向数组第一个元素的指针,并且不再是一个左值。也就是说,一般情况下的数组代表的 是数组第一个元素的地址;其类型也发生了变化——不再是数组类型,而是指针类型。