使用隐式和显式初始化有什么区别?

时间:2014-10-20 22:02:21

标签: c++ new-operator

使用运算符ij以及new使用k初始化变量lstd::auto_ptr有什么不同以下内容:

void foo() {
    // some code ...
    int* i(new int);
    int* j = new(int);
    // ... more code

    std::auto_ptr<int> k(returnsIntPtr());
    std::auto_ptr<int> l = returnsIntPtr();
    // ... some more code

    //delete i and j
}

编辑:要明确我感兴趣的是ij之间的初始化差异以及kl之间的差异。我知道使用newauto_ptr的区别。

2 个答案:

答案 0 :(得分:2)

new(int)

相当于

new int

查看[expr.new]中的语法后,

  

new-expression
::选择new new-placement opt 新型-ID    new-initializer opt
:: opt new new-placement opt ( type-id )   新初始化<子>选择

目的很明确:有些类型在传统的new type(..)方式中无法解析 例如,

auto i = new int(*)(); // Doesn't compile

auto j = new (int(*)()); // ... you guessed it

<小时/> 声明的第二个区别,即直接初始化与复制初始化,对标量没有影响。所以这些陈述完全等同:

int* i(0);
int* i = 0;

第二个通常更受欢迎。

答案 1 :(得分:0)

std :: auto_ptr(或唯一或共享指针)是一个智能指针。它是c ++的一个特性,它可以让你不必关心堆中已分配内存的破坏。

例如,如果你用new创建一些东西并且不删除它,你可能会遇到很大问题甚至导致崩溃,智能指针会处理这些证据。

如果你只是想知道明确或隐含地创造它们之间的区别......据我所知,几乎没有真正的区别。