变量初始化(指针和值)
Foo f1 = Foo(); // (1) Ok
Foo f2 = Foo; // (2) Compiler error
Foo *p1 = new Foo(); // (3) Ok
Foo *p2 = new Foo; // (4) Ok. Why??
我想知道为什么有两种方法来初始化指针。它看起来有点不一致。有一些合乎逻辑的理由,如果是的话,是什么?或者,也许这是某种遗产?如果是的话,这种符号的起源是什么?变量初始化(指针和值)
这至少有点复杂。
在处理对象时,两个表示法都是等价的。在处理基本类型时(例如int
),(3)
将初始化(零填充)该值,而(4)
不会(该值将保持未定义)。
对于自动分配的对象,这样的:
Foo f1;
声明并初始化使用默认构造函数Foo
对象。这:
Foo f2 = Foo();
声明和使用拷贝构造函数,基本上是复制一个临时对象(Foo()
),它是建立与默认构造函数的值初始化Foo
对象。
我给你看,这似乎不合逻辑,但如果你考虑可能的含义,这是很有道理的。
不知道什么Foo
可能是,既不是人也不是编译器(在这里,人性的角度,更重要的),就能够确定是否Foo f2 = Foo;
是)创建一个新的临时Foo
对象和复印建设有它另外一个或b)将变量Foo
的值分配给复制构造对象(f2
)。这对我们来说可能是显而易见的,因为我们的惯例告诉我们Foo
必须是一种大写的类型,但通常情况并非如此简单(再次说明:这主要适用于人类读者,它不必将整个源代码记住)。
(2)
和(4)
之间的区别在于,对于后者来说,只有一种解释是容许的,因为new var
(其中var
是变量)是不是一个合法的表达。
的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
尝试'新int' VS'新INT()'。 –
尝试朗读它们,用* x *'()'发音为“make an * x *”。 –
现在我很好奇。 'Foo f3'的情况也很有趣。 –