C++11中的数组初始化

定义:

int *pia = new int[10]; // array of 10 uninitialized ints

此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。

在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象。

注意:C++使用new和delete在堆(自由存储区)上分配和释放动态数组。

动态数组初始化:

1. 对于内置数据类型元素的数组,必须使用()来显示指定程序执行初始化操作,否则程序不执行初始化操作:

int *pia = new int[10]; // 每个元素都没有初始化

int *pia2 = new int[10] ();  // 每个元素初始化为0

2.类类型元素的数组,则无论是否使用(),都会自动调用其默认构造函数来初始化:

string *psa = new string[10];  // 每个元素调用默认构造函数初始化

string *psa = new string[10]();  // 每个元素调用默认构造函数初始化

C++11标准中引进了新的初始化方式:用元素初始化器的花括号列表:

int *p = new int[10]{0,1,2,3,4,5,6,7,8,9};
string *p2 = new string[10]{"a","an","the",string(3,'x')};

p2的初始化,前面四个用初始化器中元素初始化,后面的进行值初始化。

注意两点:
1.初始化器的数目如果大于元素个数,则new表达式会失败,不会分配任何内存。

2.在int *pia2 = new int[10] (); 中,虽然我们是用空括号对数组中的元素进行值初始化,但这种写法不能在括号中给出初始化器!!所以也就不能用C++11标准中的auto分配数组的方式。

在C++11中,如果有一个被括号包围的初始化器,那就可以使用auto变量从初始化器来推断我们想要分配的类型。如:

auto p1 = new auto(obj);//p指向一个和obj类型相同的对象

 p1的类型是一个指针,若obj是一个int,则p1就是一个p1*;若obj是一个string,那p1就是一个string*。

动态分配一个空数组是合法的:

char arr[0];//错误,不能定义长度为0的数组
char *cp = new char[0];//正确:但cp不能解引用

动态释放:

delete [] pia;

数组中的元素按逆序销毁,最后一个元素最先被销毁。

参考: 《C++ primer》(第五版)

猜你喜欢

转载自blog.csdn.net/zpznba/article/details/88565860