创建对象我们都很熟悉,但是创建对象的数组(也就是相当于创建一个“int”类型的数组,而这个的元素是一个一个的对象)呢?可能在看到我解释的那么多后,你觉得应该是一个道理,但是事实上真的是如此吗? 假如我们按这种方法创建,看看编译器怎么说:
int main() { int const dimension = 10; string* pStr = new string[dimension]; delete[] pStr; pStr = NULL; ssytem("pause"); return 0; }很顺利的编过了,所以没什么问题吧。然而,你有考虑过在创建这个数据的时候,编译器到底在内部做了什么吗?其实,编译器在底层调用了dimension次默认构造函数,然后迭代数组,并对每个对象赋值,这样就可能违反了C++中的一个规则,即PITA规则(声明及初始化优于赋值)。 那么解决办法是什么呢?我们这样来看,我们现在要做的就是让他初始化dimension次,而不是赋值,所以创建一个循环,循环dimension次去创建每一个对象,前提是我们先要把这dimension个对象的数组的空间开辟出来,所以我们能用指针么? 首先分配一个指针数组,然后在分配各个空闲存储区中的对象并将这些对象传递给合适的构造函数(为什么说合适呢构造函数呢?因为每一个对象可能有参,可能无参,有参的话参数类型也不尽相同)时迭代这个数组,在这种情况下将忽略默认构造函数。
int main() { int const dimension = 10; string **Pstrstring = new string*[dimension]; for (size_t i = 0; i < dimension; i++) { Pstrstring[i] = new string; } for (size_t i = 0; i < dimension; i++) { delete Pstrstring[i]; Pstrstring[i] = NULL; } delete Pstrstring; Pstrstring = NULL; system("pause"); return 0; }这样才是正确的,如果在一些大项目中,可能会减少很多出错的机会和开销。
本文中如果有不准确或不正确之处,请在评论区指出,我会第一时间改正。