繁体   English   中英

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

[英]Why separate variable definition and initialization in C++?

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

这使用了复制构造函数。

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

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

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

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

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

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

基于ROM的硬件有一个很好的技术原因,它不是样式问题:

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

例如,请参阅此GameBoy示例以获得更详尽的解释: http//www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_varinit

考虑以下情况:

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

这样很明显,两个分支都分配变量,其初始值是无关紧要的。 然而,这很少值得。

int i;
i = 42;

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

这是单独的变量声明和赋值 我没有看到任何理由。 如果您知道变量声明时的值,那么就将其初始化。 所以你的问题没有任何理由解释。

当然,如果您在申报时不知道价值,那么您没有任何选择,那么您需要分配

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

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

Object someObject;
someObject = getTheObject();

Object someObject = getTheObject();完全不同Object someObject = getTheObject();

someObject = getTheObject(); 调用Object类的赋值运算符,而在Object someObject = getTheObject(); 调用类的复制构造函数。 这也称为复制初始化名称

一个好的编译器可能会在int i; i = 42;情况下生成相同的代码int i; i = 42; int i; i = 42; int i =42 不会有太大的开销。

BTW我总是喜欢int i = 42int i; i=42 int i; i=42

Object someObject = getTheObject();

Object someObject; someObject = getTheObject();

PS: int i = 42定义并初始化iint i; i=42 int i; i=42定义i ,然后为其分配42

不,这是一个风格问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM