2011-11-09 44 views
5

給定一個類「A」存在並且是正確的。在類「B」中使用對「A」的引用而不是指針的一些負面結果會是什麼。那就是:使用引用而不是指針有什麼缺點?

// In Declaration File 
class A; 

class B 
{ 
public: 
    B(); 
    ~B(); 
private: 
    A& a; 
}; 

// In Definition File 
B::B(): a(* new A()) 
{} 

B::~B() 
{ 
    delete &a; 
} 

省略了「B」的進一步正確性,比如拷貝構造函數和賦值操作符額外的代碼,只是想證明問題的概念。

+1

有趣。我以前從未見過這樣的代碼。可能是,這只是一種避免解引用和使用' - >'並且仍然使'a'動態分配的方式,出於某種原因:? +1的問題。 –

+0

這是什麼意思,而不是隻是'一個;'?這不會比兩個引用或指針都更好嗎? – tenfour

+1

@tenfour在許多情況下,但它是一個簡化的例子 - 假設'a'背後的值是由工廠創建的。 – justin

回答

4

眼前的侷限性在於:

  • 你不能改變的參考價值。您可以更改它引用的A,但在B的整個生命週期中,您不能重新分配或重新分配a
  • a絕不能是0

因此:

  • 目的是不可轉讓。
  • B不應該拷貝構造的,除非你教A及其亞型正確克隆。
  • B將作爲集合類型的元素(如果作爲值存儲)不是一個好候選。 B的矢量可能最容易實現爲std::vector<B*>,這可能會引入進一步的複雜性(或簡化,取決於您的設計)。

這些可能是好東西,這取決於你的需求。

注意事項:

  • 切片是需要注意的如果a是分配和分配是內B到達另一個問題。
+1

+1「這些可能是好東西」......這是我認爲他們是(假設他們適用)。在可能的情況下,使用引用而不是指針指示它不爲null並且不會更改的事實...嘗試理解別人的代碼時非常有用的信息。 – timday

+0

編輯以反映缺少的代碼是複製構造函數和賦值運算符。 – JadziaMD

+1

第一個「缺點」是_非常非常好的事情,第二個只是擴展它。那'B'將不再是可分配的也是好的,因爲它比'B'更好的分配方式。 –

1

當然,通過將基準部件到您B類意味着,編譯器可以不再產生的隱含默認和拷貝構造函數,和賦值操作符;並且手動編寫的賦值運算符都不能重新分配a

我不覺得有負的成績,比其他的事實是delete &a可能看起來很奇怪。對象由new創建的事實通過將結果綁定到引用而有些丟失,並且它可能只是重要的,因爲它的生命週期必須由B控制的事實尚不清楚。

1

如果你使用一個參考:

  • 你必須在構造時提供的價值
  • 你不能改變它指的是
  • 它不能爲空
  • 它會阻止你的類可以分配

你可能會考慮使用智能p而不是(std :: unique_ptr,std :: shared_ptr等)。這具有爲您自動刪除對象的額外好處。

2

您不能在事後改變引用的對象,例如,在任務上。此外,它使您的類型非POD(無論如何,由於私有數據成員,給定的類型將是非POD,但在某些情況下可能很重要)。

但主要的缺點可能是它可能會混淆讀者的代碼。

0

對動態分配對象的引用違反了最不驚奇的原則;也就是說,沒有人通常會按照您的要求編寫代碼。總的來說,這將使未來的維護成本更高。

相關問題