2013-11-15 30 views
2

我在讀一本書,作者有一個不可複製的類,它以另一個類的成員變量結束。它突出了我,因爲作者的做法,因爲他喜歡指向參考。讓我舉個例子。傳遞一個不可複製的類

class Foo;   // noncopyable 
class WrapperFoo 
{ 
public: 
    explicit WrapperFoo(Foo& x) 
       : mFoo(&x) 
       {} 

    Foo* mFoo; 
}; 

筆者做了什麼令我驚訝的是,他通過引用傳遞的Foo對象,然後他需要的Foo對象的地址和contructs的mFoo指針。爲什麼從一個引用開始,以一個指針結束?

class Foo;   // noncopyable 
class WrapperFoo 
{ 
public: 

    explicit WrapperFoo(Integer* x) 
       : mFoo(x) 
       {} 

    Integer* mFoo; 
}; 

如果我想要一個指針,這似乎更直接(和相同)。我明白這可能只是偏好。

class Foo;   // noncopyable 
class WrapperFoo 
{ 
public: 
    explicit WrapperFoo(Integer& x) 
       : mFoo(x) 
       {} 

    Integer& mFoo; 
}; 

此外,我讀過更喜歡引用指針,所以爲什麼不呢?

我相信這三個例子正在完成同樣的任務。我錯過了什麼嗎?爲什麼作者更喜歡在這個例子中指向引用?最後,是否有這個用法的名稱?

+2

一旦你有一個引用數據成員,你的類變得不可分配。 – dyp

回答

1

引用作爲數據成員往往並不令人不快,因爲它們必須在初始化程序列表中初始化(在創建對象時,這有一些含義,例如類型是不可分配的)。保留一個指針通常是一個更好的想法 - 儘管如果它是一個擁有指針,那麼不妨使用std :: shared_ptr或std :: unique_ptr。

至於爲什麼他使用引用,然後他採取了地址,那麼,它是爲了避免作爲數據成員的參考和保持簡單的接口(以便arg而不是& arg可以是使用。)

1

我對作者意圖的猜測是採用引用而不是指針意味着我們在對象創建時保證地址包含有效對象。指針的存儲使得對象可複製,並且如果需要的話可重新綁定。

儘管沒有一種方法可以保證傳遞的對象在創建對象後保持有效。

1

傳遞引用可以防止將NULL指針傳遞給構造函數。它確保在創建過程中存在該對象。