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

问题描述 投票:0回答:8

我目前正在研究一些相当古老的 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();

这会导致任何问题吗?

c++ variables initialization definition
8个回答
16
投票
Object someObject;
someObject = getTheObject();

这使用了赋值运算符。

Object someObject = getTheObject();

这使用了复制构造函数。

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

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


8
投票

在非常旧的 C 版本中,有一个限制,即您必须在代码块的顶部定义变量,即使您只在函数的稍后位置需要它们。因此,在 C 的旧时代,人们通常首先定义所有变量,然后再考虑它们应该具有的值。

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

不过,没有真正的理由在 C++ 中这样做。最好始终定义可以直接初始化的变量。


6
投票

强烈建议您提出的更改!这是 C++ 编程中一个重要习惯用法的一部分,即“资源获取就是初始化”。


2
投票

SomeType object; if( whateverCondition ) { object = getObjectOneWay(); } else { object = getObjectAnotherWay(); }

这样很明显两个分支都分配了变量并且它的初始值是无关的。然而,这很少值得。


2
投票
为什么在 C++ 中将变量定义和初始化分开?

你还没有分开定义和初始化。您刚刚在代码片段中分配了变量/对象(某些特定的)值。所以标题有误导性。

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
分配给它。


2
投票

在基于 ROM/EEPROM 的嵌入式系统上,这会影响二进制值写入的位置。未初始化的变量写入.bss,而初始化的变量写入.data。过早的初始化会使您的 ROM 空间膨胀,这在较旧的嵌入式系统上可能会给您带来很大的麻烦。如果您运行的系统具有较小的 ROM,则如果进行不必要的初始化,则可能会耗尽内存。一些愚蠢的编译器甚至会直接寻址到 ROM,如果你不小心的话,这些值实际上是只读的。

例如请参阅此 GameBoy 示例以获得更全面的解释:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_varinit

int i; i = 42;

1
投票
这不是单独的变量定义和
初始化

这是单独的变量声明和

赋值

。我看不出有什么理由。如果您在声明变量时知道该值,则立即对其进行初始化。所以你的问题没有任何合理的解释。 当然,如果你不知道声明时的值,那么你就没有任何选择,那就需要赋值

不。这是风格问题。

0
投票
但是,如果他想将声明移出函数,那么如果声明和初始化是分开的,那么编辑就会减少。

© www.soinside.com 2019 - 2024. All rights reserved.