如何创建对象的数组

  创建对象我们都很熟悉,但是创建对象的数组(也就是相当于创建一个“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;
}

  这样才是正确的,如果在一些大项目中,可能会减少很多出错的机会和开销。

  本文中如果有不准确或不正确之处,请在评论区指出,我会第一时间改正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值