2011-10-31 98 views
4
Foo f1 = Foo();  // (1) Ok 
Foo f2 = Foo;  // (2) Compiler error 

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

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

+1

尝试'新int' VS'新INT()'。 –

+0

尝试朗读它们,用* x *'()'发音为“make an * x *”。 –

+0

现在我很好奇。 'Foo f3'的情况也很有趣。 –

回答

4

这至少有点复杂。

在处理对象时,两个表示法都是等价的。在处理基本类型时(例如int),(3)将初始化(零填充)该值,而(4)不会(该值将保持未定义)。

对于自动分配的对象,这样的:

Foo f1; 

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

Foo f2 = Foo(); 

声明和使用拷贝构造函数,基本上是复制一个临时对象(Foo()),它是建立与默认构造函数的值初始化Foo对象。

1

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

不知道什么Foo可能是,既不是人也不是编译器(在这里,人性的角度,更重要的),就能够确定是否Foo f2 = Foo;是)创建一个新的临时Foo对象和复印建设有它另外一个或b)将变量Foo的值分配给复制构造对象(f2)。这对我们来说可能是显而易见的,因为我们的惯例告诉我们Foo必须是一种大写的类型,但通常情况并非如此简单(再次说明:这主要适用于人类读者,它不必将整个源代码记住)。

(2)(4)之间的区别在于,对于后者来说,只有一种解释是容许的,因为new var(其中var是变量)是不是一个合法的表达。

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