![](/img/trans.png)
[英]C++ syntax question - Why can't I use comma to separate variable definition of different types
[英]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 = 42
到int i; i=42
int i; i=42
和
Object someObject = getTheObject();
至
Object someObject; someObject = getTheObject();
PS: int i = 42
定义并初始化i
而int i; i=42
int i; i=42
定义i
,然后为其分配42
。
不,这是一个风格问题。
但是,如果他想要将声明移出函数,那么如果声明和初始化是分开的,那么编辑就会少一些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.