[英]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.