2012-11-13 87 views
1

可能重複:
C++ - when should I use a pointer member in a classC++類的定義。屬性指針?這是正確的方式?

我用C++工作了多年,但我仍然有我沒有回答問題.. 我定義一個C++類,但我有一些疑惑關於這個

問題1:我應該使用指針存儲投資嗎?

Investment* investment; 
// or 
Investment investment; 

問題2:爲什麼?

問題3:如果我使用Investment investment;我應該用這種方式返回一個參考Investment & getInvestment();

我知道,這兩個方面,我的代碼工作,但我想知道有效的方式來做到這一點..

代碼如下:

class Urgency 
{ 
private: 
    Investment* investment; 
public: 
    Urgency(Investment* investment); 
    ~Urgency(void); 

    Investment* getInvestment(); 
}; 
+1

@jogojapan我已經看到這個問題,但我有另一個關於這個問題沒有回答..請參閱問題2和3 ..謝謝 – thiagoh

+1

我相信問題2(「爲什麼?」)由重複問題回答儘管在一個非常普遍的層面上。如果你需要一個更具體的答案,你將不得不提供更多關於「投資」類是什麼以及如何使用它的細節。問題3實際上可能證明一個完全獨立的帖子是合理的(如果有重複的話,我也不會感到驚訝)。 – jogojapan

+1

@ jogojapan對不起,但我不同意你..我準備了一個問題,在我看來可以澄清這些疑問更多的完整方式.. – thiagoh

回答

3

我通常更喜歡在對象很大時使用指針,而在較小時使用堆棧對象。指針允許一些事情,例如惰性init和前向聲明,而堆棧對象減少了創建自己的拷貝構造函數所需的可能性,並且不必擔心顯式地銷燬析構函數中的對象。 (儘管你可以使用一個共享指針類型對象來爲你做這件事)另外,一個堆棧對象通常訪問速度更快,但在大多數情況下,這不應該是選擇一個作爲另一個的理由,因爲大多數情況下應用程序可以忽略不計。

參照您的代碼,您通常會返回const Investment &以便不允許直接修改投資對象。如上所述,如果您使用原始指針,則應該創建一個副本構造函數和一個析構函數,以正確管理對象上的內存。使用指針對象時,通常會再次返回const Investment *以刪除外部調用者直接修改對象的功能。如何你的功能,在投資類,當您返回常量正確的投資對象申報

採取通知。如果你只有Investment::getNumShares(),你將無法使用const引用或const指針訪問該函數。若要解決此問題,將所有不修改對象的成員函數標記爲const,如Investment::getNumShares() const

0
  • 通過使用指針,你可以選擇何時分配內存並且還將其刪除,而正常的聲明有自動存儲。要回答這個問題,這實際上取決於您正在編寫的程序類型和個人偏好。

    class Foo 
    { 
        Foo* Obj; //choose when to allocate this object, dynamically allocated 
        Foo Obj2; //automatic, runs through the life of the object. 
    } 
    
  • 你可以,但用於分配地址的替代的解決方案將被使用帶一個參數,它設置對象的引用void函數。

    void GetVar(int *Address_Holder) 
        { 
         //assign address 
        } 
    
1
  1. 不使用指針,除非你絕對需要他們
  2. ,因爲他們很容易出錯,當不使用非常仔細地
  3. 更好的是,如果返回const &你不打算讓每個人都做你的變化Investment
0

如果要控制何時將內存分配給對象以及何時刪除它,請使用指針。如果你有大尺寸的對象,那麼使用指針作爲傳遞函數的指針會比傳遞對象本身更快(或者你可以通過引用傳遞)。在任何其他情況下,使用對象而不是指針是可取的,因爲指針的使用非常容易出錯。

1

問題1/2:我應該存儲投資,通過使用指針或沒有? /爲什麼?

Investment* investment; 
// or 
Investment investment; 

有優點和缺點每個。

不使用指針:

  • 節省您不必擔心創建和刪除投資對象的麻煩 - 儘管你可以明確地選擇你的初始化列表中,如果有用的投資構造。
  • 指本投資對象宿主對象,可節省一個堆分配和解除分配中分配。這可能會提高內存效率並且性能更好。

使用指針:

  • 允許您使用延遲初始化:你可以推遲創建的投資對象,直到包含對象的實際需要,然後再可能刪除它不再需要時。這種生命週期的手動控制可用於微調內存使用情況。當指針沒有指向實際投資時,在指針中存儲NULL/0是一種常用的做法,可以幫助跟蹤此情況。
  • 意味着你可以給投資對象的所有權代碼的對象之外......他們可以繼續使用它,並在適當的時候將其刪除。
  • 意味着你必須仔細製作一個拷貝構造函數,並仔細處理構造函數中的異常。智能指針可能能夠幫助這些事情。
  • 意味着您可以分配派生自Investment的類的實例,並通過相同的指針使用它。這允許您選擇一個適合您的運行時需求的自定義實現,或者根據需要的不同來改變實現。這種靈活性是面向對象編程和運行時多態性的基石。
  • 意味着您的包含對象的頭只需要看到(無論是通過#include或在同一個文件),投資類的前向聲明。這意味着可以對投資對象進行更改,而不強制重新編譯僅使用包含對象的代碼(只需重新鏈接包含修改後的投資實現的對象)。這個概念與指向實現或pImpl習慣用法相同,儘管投資並不一定是包含類的實現的專用部分,並且可以在程序中的其他地方直接和獨立地使用。

問題3:如果我使用投資投資;我應該用這種方式返回一個參考投資& getInvestment();?

這取決於很多程序。有時最好避免直接暴露數據成員,而是在包含對象中提供更高級別的邏輯函數,以便在投資上做一些工作:這樣您可以在投資對象周圍維護額外的不變量 - 即您可以控制,協調和監視何時以及如何使用它。其他時候暴露它可能更實際一些。

如果您確定實際上有一個投資對象要返回,則返回引用僅適用:在您的指針版本中,實現可能需要創建/ new投資對象(如果它尚未擁有一個。或者,返回指針意味着您可以返回NULL/0到客戶端代碼,以表明您還沒有投資對象,但是您必須確保您的類和客戶端代碼瞭解誰將持有所有權(即投資對象delete的權利/義務),並且雙方都不會嘗試在對方delete之後使用該投資。

相關問題