为什么在C++中分离变量定义和初始化?

Bal*_*win 21 c++ variables initialization definition

我目前正在研究一些相当古老的C++代码,并经常发现类似的东西

int i;
i = 42;
Run Code Online (Sandbox Code Playgroud)

要么

Object* someObject = NULL;
someObject = new Object();
Run Code Online (Sandbox Code Playgroud)

甚至

Object someObject;
someObject = getTheObject();
Run Code Online (Sandbox Code Playgroud)

我完全理解这段代码的作用,但我真的不知道变量定义和初始化的这种分离是否有用.我搜索了一些解释,但总是最终得到成员初始化列表或者应该定义局部变量的问题.

最后,我不明白为什么有人可能故意编写这段代码.它只是将定义和初始化分成两个后续行并创建开销 - 在最后一种情况下,它使用默认构造函数创建一个对象,仅在下一行中销毁它.

我想知道我是否应该简单地将代码更改为

int i = 42;
Object* someObject = new Object();
Object someObject = getTheObject();
Run Code Online (Sandbox Code Playgroud)

这会导致任何问题吗?

Eri*_*rik 16

Object someObject;
someObject = getTheObject();
Run Code Online (Sandbox Code Playgroud)

这使用赋值运算符.

Object someObject = getTheObject();
Run Code Online (Sandbox Code Playgroud)

这使用了复制构造函数.

除此之外,您建议的更改是等效的,您应该实现它们.复制ctor /赋值运算符的差异预计会产生相同的结果,但这并不是由语言强制执行的.

我认为没有正当理由像原始代码那样拆分声明和赋值 - 即使出于所有实际目的,它也不会引入开销(除了对象)


sth*_*sth 8

在C中,您必须在代码块的顶部定义变量,即使您稍后在函数中只需要它们.因此,在C的旧时代,人们通常首先定义所有变量,然后再定义他们应该拥有的值.

既然你说它是相当古老的C++代码,它可能会使用与C实践中的保留相同的约定.

但是,在C++中没有真正的理由这样做.最好总是定义您可以直接初始化它们的变量.


Bjö*_*lex 6

强烈建议您提出改变!这是C++编程中一个重要习语的一部分,即资源获取是初始化.