我目前正在研究一些相当古老的 C++ 代码,经常发现类似的东西
int i;
i = 42;
或
Object* someObject = NULL;
someObject = new Object();
甚至
Object someObject;
someObject = getTheObject();
我完全理解这段代码的作用,但我真的不知道这种变量定义和初始化的分离何时会有帮助。我搜索了一些解释,但最终总是得到成员初始化列表或何时应该定义局部变量的问题。
最后,我不明白为什么有人会故意编写这段代码。它只是将定义和初始化分成两行并产生开销 - 在最后一种情况下,它使用默认构造函数创建一个对象,然后在下一行中销毁它。
我想知道我是否应该简单地将代码更改为
int i = 42;
Object* someObject = new Object();
Object someObject = getTheObject();
这会导致任何问题吗?
Object someObject;
someObject = getTheObject();
这使用了赋值运算符。
Object someObject = getTheObject();
这使用了复制构造函数。
除此之外,您建议的更改是等效的,您应该实施它们。复制构造函数/赋值运算符的差异是预期会产生相同的结果,但这并不是由语言强制执行的。
我认为没有像原始代码那样分开声明和赋值的有效理由 - 即使出于所有实际目的,它不会引入开销(对象除外)
在非常旧的 C 版本中,有一个限制,即您必须在代码块的顶部定义变量,即使您只在函数的稍后位置需要它们。因此,在 C 的旧时代,人们通常首先定义所有变量,然后再考虑它们应该具有的值。
既然你说它是相当古老的 C++ 代码,它可能会使用相同的约定作为 C 实践的保留。
不过,没有真正的理由在 C++ 中这样做。最好始终定义可以直接初始化的变量。
SomeType object;
if( whateverCondition ) {
object = getObjectOneWay();
} else {
object = getObjectAnotherWay();
}
这样很明显两个分支都分配了变量并且它的初始值是无关的。然而,这很少值得。
你还没有分开定义和初始化。您刚刚在代码片段中分配了变量/对象(某些特定的)值。所以标题有误导性。
Object someObject;
someObject = getTheObject();
与
Object someObject = getTheObject();
有很大不同
someObject = getTheObject();
调用
Object
类的赋值运算符,而在 Object someObject = getTheObject();
中调用类的复制构造函数。这也被称为“复制初始化”
一个好的编译器可能会在 int i; i = 42;
和 int i =42
的情况下生成相同的代码。不会有太多开销。
顺便说一句,我总是更喜欢
int i = 42
而不是int i; i=42
和
Object someObject = getTheObject();
至
Object someObject;
someObject = getTheObject();
P.S:
int i = 42
定义并初始化i
,而
int i; i=42
定义
i
,然后将
42
分配给它。
。 这是单独的变量声明和
赋值。我看不出有什么理由。如果您在声明变量时知道该值,则立即对其进行初始化。所以你的问题没有任何合理的解释。 当然,如果你不知道声明时的值,那么你就没有任何选择,那就需要赋值
。不。这是风格问题。