2012-07-17 72 views
1

我有一個類,我實現了我自己的構造函數,析構函數,複製構造函數 和複製賦值運算符。運營商和構造函數

該類有一個核心的成員集,我在上面所有的一些「狀態變量」,我添加爲一些方法的助手。

這些狀態變量永遠不會(因爲我沒有打擾它)在構造函數中初始化,但在使用之前初始化。

因爲這樣的複製構造函數和複製分配什麼都不做。他們只是複製我明確需要的成員。

  • 這是一個問題嗎?
  • 未明確複製的成員會發生什麼(btw,這些成員中沒有指針)?
    • 他們也不能在構造
  • 初始化可這導致任何「隱藏」的問題?

乾杯 安德烈

+0

+1第一句話:) – 2012-07-17 11:21:18

回答

1

如果這些變量是對象狀態的一部分,那麼它們應該被複制。如果變量不是對象狀態的一部分,則它們不應該是成員。如果接口中任何函數的結果取決於操作開始前該變量的值,則變量是對象狀態的一部分。

上面的一般規則很少有例外,特別是有幾個成員變量不參與對象的狀態(它們通常標記爲mutable),作爲同步機制或來自複雜結果的緩存操作。

回到你的問題,從描述看來,你可能只是將這些成員用作不同成員函數之間的通信機制。接口中的一個函數設置值,然後調用讀取/修改它們的其他函數。如果是這種情況,請考慮將變量作爲參數傳遞給函數。通過使用成員,您可以有效地隱藏函數對這些值的依賴關係,並且同時增加對類的依賴性。

如果接口中的任何函數訪問這些成員,則在這種情況下,在賦值(或複製構造)之後源和目標將表現不同,這打破了在複製初始化/來源和目標對象的分配是等效。基本上,從實際角度來看,如果這些成員不屬於對象狀態的一部分,那麼您可能會忽略當前的方法,但我會真正重新考慮設計。如果他們確實參與了對象的狀態,則不應該以任何方式避免複製它們。

3

Can this be a problem?

- 如果您在使用之前用來初始化他們,不要忘記釋放(在指針的情況下),我看不出有什麼問題。

What happens to members that aren't explicitly copied (btw, no pointers in these members)? they are also not initialized in the constructor

- 他們保持垃圾

Can this lead to any "hidden" problems?

不,如果你小心

但我建議你initilized它們的構造在任何情況下,因爲這將是更容易以這種方式捕捉錯誤,並使對象始終保持完整狀態。例如,捕獲nullptr指針然後是垃圾指針或指向釋放對象的指針要容易得多。因爲在第一種情況下,程序只會崩潰(解引用空指針是UB,但通常它只是一個崩潰)

另外,我會優先創建局部變量來存儲中間結果,如果可能的話。如果它不是單個方法的中間結果 - 那麼它可能是一個坑,如果在初始化之前在其他方法中使用此變量,可能會出現這種情況。在這種情況下,存儲零初始化變量會更好 - 因此,您可以在對其進行計算之前將其處於有效狀態

1

從C++的角度來看,這裏沒有任何問題,但C++並不能保護您在腳下射擊自己。在幾個月內,您可能正在調試僅在發佈版本中發生的錯誤,然後您將花費幾天的時間找出發生這種情況的原因。有很多問題,爲什麼我的應用程序在Release中工作,而不是在Debug中,其中一個原因是調試堆初始化分配的內存。