Foo f1 = Foo(); // (1) Ok
Foo f2 = Foo; // (2) Compiler error
Foo *p1 = new Foo(); // (3) Ok
Foo *p2 = new Foo; // (4) Ok. Why??
我想知道为什么有两种方法来初始化指针。它看起来有点不一致。有一些合乎逻辑的理由,如果有的话,是什么?或者,也许这是某种遗产?如果是这样,这种符号的起源是什么?
答案 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