变量初始化(指针和值)

时间:2011-10-31 23:39:56

标签: c++ pointers constructor variable-initialization

Foo f1 = Foo();      // (1) Ok
Foo f2 = Foo;        // (2) Compiler error

Foo *p1 = new Foo(); // (3) Ok
Foo *p2 = new Foo;   // (4) Ok. Why??

我想知道为什么有两种方法来初始化指针。它看起来有点不一致。有一些合乎逻辑的理由,如果有的话,是什么?或者,也许这是某种遗产?如果是这样,这种符号的起源是什么?

3 个答案:

答案 0 :(得分:4)

有点......复杂,至少可以说。

处理对象时,两种符号都是等效的。处理原始类型(例如int)时,(3)将初始化(零填充)该值,而(4)则不会(该值将保持未定义)。

对于自动分配的对象,请执行以下操作:

Foo f1;

使用默认构造函数声明并初始化Foo对象。这样:

Foo f2 = Foo();

使用复制构造函数声明并初始化Foo对象,实质上是复制临时对象(Foo())的值,该对象是使用默认构造函数构建的。

答案 1 :(得分:1)

我告诉你,这似乎是不合逻辑的,但如果你考虑可能的含义,那就很有道理。

在不知道Foo可能是什么的情况下,人类和编译器(此处,人类视角更重要)都无法确定Foo f2 = Foo;是否a)创建新的临时{{} 1}}对象和副本用它构造另一个或b)将变量Foo的值赋给复制构造对象(Foo)。对我们来说这似乎是显而易见的,因为我们的约定告诉我们f2必须是一个类型,因为它是大写的,但总的来说它并不那么简单(再次:这主要适用于不一定具有完整的源代码记忆)。

Foo(2)之间的区别在于后者只允许一种解释,因为(4)(其中new var是变量)不合法表达

答案 2 :(得分:1)

基于范围的资源相当于4实际上只是

Foo f;

差异的遗留原因基本上是在C中,原始类型(例如int)未默认初始化为有用的东西。出于性能原因,C ++当时继承了这种行为。当然,现在,处理器的处理时间是微不足道的。在C ++中,他们引入了一种新的语法,通过它总是初始化 - 括号。

int i = int();

i始终保证为0。

int i;

i的值未定义。

这与指针种类完全相同,只有一些new

int* i = new int(); // guaranteed 0
int* i = new int; // undefined