2013-06-02 44 views
2

假設我們有一個靜態創建的對象(Type mObject;),它使用getObject()方法向程序員公開。我想知道以這種方式獲取對象有什麼優點和缺點?使用指針和引用獲取對象

Type* SomeClass::getObject() { 
    return &mObject; 
} 

// the programmer types 
Type* obj = someClassObj.getObject(); 
obj->someMethod(); 

和這樣:

Type& SomeClass::getObject() { 
    return mObject; 
} 

// the programmer types 
Type& obj = someClassObj.getObject(); 
obj.someMethod(); 
+1

以前的API幾乎鼓勵程序員在完成對象時調用delete,或者至少讓他想知道如何清理。 –

+3

在第一種情況下,您必須記錄誰擁有返回的指針,並希望客戶閱讀文檔。請注意,兩者都具有常量正確性問題。 – juanchopanza

+0

在第一種情況下,你可以返回NULL,所以調用者需要檢查這個。 – spiritwolfform

回答

5

在++中,我們使用指針相當罕見純C。特別是生指針。

大部分代碼處理對象實例。由於C++的引用是通過身份來引用它們的,所以不像C那樣,將地址和指針傳遞給它是必須的。像:

  • 當你希望NULL指示不
  • 當你想切換到不同的對象
  • (重新分配指針)
  • 當你轉移所有權

你的榜樣適合既沒有類,所以你使用一個參考。這將消息傳遞給用戶一個對象將永遠在那裏。所以大部分時間點修復obj,你可以繼續使用someClassObj.getObject().someMethod()。第一種情況需要在兩者之間進行NULL檢查。

+0

優秀,全面,簡潔! – davka

1

返回一個指針引發了很多模糊/問題(它可能是NULL嗎?我必須delete它嗎?),同時返回對此靜態實例的引用會引入保證。也就是說,該對象將始終被分配並且將始終返回一個實例(從技術上講,如果您在初始化過程中訪問該靜態實例,則該靜態實例可能不會構造)。

雖然它是實現定義的,但是我知道所有使用指針的引擎在引用時(在最壞的情況下)都是「引擎蓋下」。因此,除非必須引入副本或升級,否則使用引用不會增加成本。

在這種情況下,您應該返回一個引用。在大多數C++環境中,當提供所有你需要的功能時,引用比指針更受歡迎。