2010/10/31
关键字:数组
数组声明
数组的维数必须用值大于等于1的常量表达式定义。包括整型字面值、枚举常量或用常量表达式初始化的const对象。即数组的维数必须在编译时确定。
#include <vector>
using std::vector;
const int bufsize = 10;
int GetSize()
{
return 0;
}
const int i = GetSize(); //i位于常量内存区中,未初始化
int main()
{
char array[i]; //错误,运行时才知道i的值
char array1[bufsize*10/2+1-3]; //正确,编译时就可以知道i的值
int j = 1;
char array2[j]; //错误,虽然j是用常量表达式初始化的,
//但是直到运行时才知道j的值
char array3[0]; //错误,必须非零
char array4[1111111111111111]; //编译错误
//error C2148: total size of array must not exceed 0x7fffffff bytes
//0x7fffffff是有符号型位整型的最大值
vector<int> vec1(i); //正确
vector<int> vec2(bufsize*10/2+1-3); //正确
vector<int> vec3(j); //正确
vector<int> vec4(0); //正确
vector<int> vec5(1111111111111111); //编译时就可以检测参数大小会报警告或
//错误,如果报警告则运行时抛异常
return 0;
}
简单的总结下,位于常量内存区中及静态全局内存区并且是已初始化的变量,在编译时是已知的,才可以作为数组的维数.vector的元素个数除了非负数和太大之外,没其他限制.
通过编译器的报错也可以知道在VC8中,数组最大为0x7fffffff.
数组初始化
1. 内置类型数组,在函数体内的数据未初始化;
2. 内置类型数组,函数体外则初始化为0;
3. 不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数初始化,如果没有默认构造函数,则必须为该数组的元素提供显式初始化;
class A
{
private:
int a;
};
A g_Array[3]; //3个对象的a都被初始化为0
int main()
{
A array[3]; //3个对象的a都未初始化
return 0;
}
初始化时调用的是类A的默认构造函数A(){},该函数不做任何事情,只负责分配内存并初始化变量.初始化变量的规则与初始化一般变量相同.
陷阱
char ca1[] = {'C', '+', '+'}; //正确,大小为3
char ca2[] = {'C', '+', '+', '/0'}; //正确,大小为4
char ca3[] = "C++"; //正确,大小为4
char ca4[3] = "C++"; //错误,字面值常量字符串都有一个’/0’作为结尾
程序员必须自己检查数组下标,编译器无法检测到缓冲区溢出(buffer overflow).