如何创建对象的数组
2017-03-12 15:47
435 查看
创建对象我们都很熟悉,但是创建对象的数组(也就是相当于创建一个“int”类型的数组,而这个的元素是一个一个的对象)呢?可能在看到我解释的那么多后,你觉得应该是一个道理,但是事实上真的是如此吗?
假如我们按这种方法创建,看看编译器怎么说:
很顺利的编过了,所以没什么问题吧。然而,你有考虑过在创建这个数据的时候,编译器到底在内部做了什么吗?其实,编译器在底层调用了dimension次默认构造函数,然后迭代数组,并对每个对象赋值,这样就可能违反了C++中的一个规则,即PITA规则(声明及初始化优于赋值)。
那么解决办法是什么呢?我们这样来看,我们现在要做的就是让他初始化dimension次,而不是赋值,所以创建一个循环,循环dimension次去创建每一个对象,前提是我们先要把这dimension个对象的数组的空间开辟出来,所以我们能用指针么?
首先分配一个指针数组,然后在分配各个空闲存储区中的对象并将这些对象传递给合适的构造函数(为什么说合适呢构造函数呢?因为每一个对象可能有参,可能无参,有参的话参数类型也不尽相同)时迭代这个数组,在这种情况下将忽略默认构造函数。
这样才是正确的,如果在一些大项目中,可能会减少很多出错的机会和开销。
本文中如果有不准确或不正确之处,请在评论区指出,我会第一时间改正。
假如我们按这种方法创建,看看编译器怎么说:
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; }
这样才是正确的,如果在一些大项目中,可能会减少很多出错的机会和开销。
本文中如果有不准确或不正确之处,请在评论区指出,我会第一时间改正。
相关文章推荐
- 如何在JavaScript中手动创建类数组对象
- 【Unity&对象数组】如何创建一个长度不确定的对象数组以及使用方法&墙壁单元方块对象数组
- 如何利用窗体身份验证创建 GenericPrincipal 对象
- 如何将对象数组转换成DataSet
- ABAP--如何创建和使用sap的号码范围对象
- 深入探索.NET框架内部了解CLR如何创建运行时对象
- 如何创建XMLHTTPRequest对象
- 如何利用窗体身份验证创建 GenericPrincipal 对象
- Spring讲述如何创建hibernate配置文件对象
- ABAP--如何创建和使用sap的号码范围对象
- ABAP--如何创建和使用sap的号码范围对象
- 如何动态创建一个数组
- 如何封装查询记录到Java对象数组
- 如何使用 Visual Studio .NET 工具创建数据库对象和 Transact-SQL 存储过程。
- 如何将PHP的数组转化成对象
- ABAP--如何创建和使用sap的号码范围对象
- 如何使用 Forms 身份验证创建 GenericPrincipal 对象
- 如何用创建命名对象来判断应用程序是否已有一个实例在运行?
- VB6 给对象数组如何定义事件?
- 完成DELPHI的不可能功能:宏替换!(如何根据字符串来创建对象)