c++数组的初始化

在c++ primer fourth edition上在描述数组的初始化时,有这样一句话:

数组的维数必须用值大于等于 1 的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型 const 对象。非 const 变量以及要到运行阶段才知道其值的 const变量都不能用于定义数组的维数。

但以下测试程序在gcc编译器下,用非const常量作为数组初始化的维数也没有报错,网上查了资料,原来这是C99的标准,C89的版本是不支持非const定义数组维数的,gcc编译器内部做了优化,但没有测试VS编译器下是否通过。

	// 以下gcc编译通过
	/*const*/ unsigned int buf_size = 3;

	int int_array[buf_size];
	for( unsigned int index = 0; index != buf_size ; index++ ){
		int_array[index] = index;
	}

	for( unsigned int index = 0; index != buf_size ; index++ ){
		cout << int_array[index];
		if( index < buf_size - 1 ){
			cout << "_";
		}
	}
	cout << endl;

但是用直接初始化数组的方式却不通过编译:error: variable-sized object 'str_array' may not be initialized.

unsigned int max_size = 3;
string str_array[max_size] = {"aa", "bb", "cc"};


针对于此,显示初始化数组,无需指定维数:

string str_array[] = {"aa", "bb", "cc"};


关于字符数组:

// error: initializer-string for array of chars is too long [-fpermissive]
char arr_1[3] = "abc";		// 维数是4,相当于char arr_1[3] = {'a','b','c','\0'}, '\0'为空字符串
char arr_2[3] = {'a','b','c'};	// 维数是3


与vector不一样,数组不允许直接复制和赋值

int ia[] = {0, 1, 2};	// ok: array of ints
int ia2[] = ia;			// error: initializer fails to determine size of 'ia2'
int ia3[](ia);			// error: initializer fails to determine size of 'ia3'


对于的数组的初始化,如果没有显式提供元素初值,则数组元素会像普通变量一样初始化:

  1. 在函数体外定义的内置数组,其元素均初始化为 0;
  2. 在函数体内定义的内置数组,其元素无初始化;
  3. 不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;
  4. 如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。

















  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值