簡體   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