为什么要在C++;? 我目前正在研究一些相当古老的C++代码,经常会发现像之类的东西。 int i; i = 42;

为什么要在C++;? 我目前正在研究一些相当古老的C++代码,经常会发现像之类的东西。 int i; i = 42;,c++,variables,initialization,definition,C++,Variables,Initialization,Definition,或 甚至 Object someObject; someObject = getTheObject(); 我完全理解这段代码的功能,但我真的不知道这样一种分离变量定义和初始化的方法何时会有用。我搜索了一些解释,但总是以成员初始化列表或何时应该定义局部变量的问题结束 最后,我不明白为什么有人会故意写这段代码。它只是将定义和初始化拆分为两行,并创建开销——在最后一种情况下,它使用默认构造函数创建一个对象,然后在下一行中销毁它 我不知道我是否应该简单地将代码更改为 int i = 42; Objec

甚至

Object someObject;
someObject = getTheObject();
我完全理解这段代码的功能,但我真的不知道这样一种分离变量定义和初始化的方法何时会有用。我搜索了一些解释,但总是以成员初始化列表或何时应该定义局部变量的问题结束

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

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

int i = 42;
Object* someObject = new Object();
Object someObject = getTheObject();
这会导致任何问题吗

int i;
i = 42;
这不是单独的变量定义和初始化

这是单独的变量声明和赋值。我看不出有什么理由。如果您在声明变量时知道该值,那么请立即初始化它。所以你的问题没有任何理由解释

当然,如果您在声明时不知道值,那么您没有任何选择,您需要赋值

这将使用赋值运算符

Object someObject = getTheObject();
这将使用复制构造函数

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


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

不。这是一个风格问题


但是,如果他想将声明移出函数,那么如果声明和初始化分开,编辑将更少。

强烈建议您进行更改!这是C++编程中一个重要的成语,即

考虑以下情况:

SomeType object;
if( whateverCondition ) {
   object = getObjectOneWay();
} else {
   object = getObjectAnotherWay();
}
这样很明显,两个分支都分配了变量,其初始值是无关的。然而,这几乎不值得

为什么在C++中使用变量定义和初始化?< /P> 您没有分离定义和初始化。您刚刚在代码段中为变量/对象(某些特定)赋值。因此,这个标题具有误导性

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

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

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

顺便说一句,我总是喜欢
inti=42
而不是
inti;i=42

objectsomeobject=getTheObject()

objectsomeobject;
someObject=getTheObject()


注:
inti=42
定义并初始化
i
inti;i=42
定义
i
,然后将
42
赋值给它。

在C中,有一个限制,即必须在代码块的顶部定义变量,即使您以后只需要在函数中的某个地方使用它们。所以在旧的C语言时代,人们通常先定义所有的变量,然后再考虑他们应该拥有的值

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


在C++中没有真正的理由来做这件事。最好总是在可以直接初始化变量的地方定义变量。

基于ROM的硬件有一个很好的技术原因,这不是风格问题:

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

e、 g.请参阅此GameBoy示例以获得更全面的解释:

同意,但答案在哪里?@Baldewin:我想我的回答是(或者更确切地说是)我看不出有什么理由这样做。并补充说,如果您在声明变量时知道该值,那么请立即初始化它@纳瓦兹:
inti
不仅仅是一个声明,也是一个定义。@Prason:我认为,在C语言中,有一种叫做“暂定定义”的东西,它不是这样的“定义”。@Nawaz:我的意思是在OP的代码
inti
中,它不仅仅是一个声明,也是一个定义。暂定定义是不同的,与OP提供的代码无关。可能是由具有ANSI C背景的人编写的。是的,看起来肯定是受C影响的。基本上,你在函数开始时定义了所有局部变量,然后才使用它们,将内存分配给指针等。如果只使用一个局部变量,则会导致您观察到的两行组合。SomeType object=whateverCondition?getObjectOneWay():getObjectAnotherWay()@埃里克:你这几天很火。11k代表在任何时候。很好。:)第一个版本还使用默认构造函数在赋值之前初始化某个对象。感谢您的解释
SomeType object;
if( whateverCondition ) {
   object = getObjectOneWay();
} else {
   object = getObjectAnotherWay();
}
Object someObject;
someObject = getTheObject();