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

What is the difference between initializing with implicitly and explicitly?

本文关键字:初始化 什么 区别      更新时间:2023-10-16

在以下情况下,使用运算符new初始化变量ij以及使用std::auto_ptr初始化kl有什么区别:

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的区别。

new(int)

相当于

new int

在看了[expr.new]中的语法之后,

新表达式
:: opt new新建位置opt新型id新初始值设定项opt
:: opt new新放置option(类型id)新初始值设定项opt

意图是明确的:有些类型不能用传统的new type(..)方式解析
例如,

auto i = new int(*)(); // Doesn't compile
auto j = new (int(*)()); // ... you guessed it


声明中的第二个区别,即直接初始化与复制初始化,对标量没有区别。因此,这些声明是完全等效的:

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

第二种通常更受欢迎。

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

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

如果你只想知道显式或隐式创建它们之间的区别。。。据我所知,几乎没有什么真正的区别。