2012-09-07 48 views
2

大家好,編程C/C++代碼的專家。
我偶然發現了這段代碼,但我很困惑2個函數返回了什麼。
任何一種靈魂都可以幫助我嗎?
我試圖使代碼儘可能對其他人有用,這是一般的&。這些C++函數返回什麼? ClassA *&func1()

ClassA*& func1() { 
    static ClassA* mClassA; 
    return mClassA; 
} 

ClassA* func2() { 
    ClassA*& mClassA = func1(); 
    if(!mClassA) { 
     ... // omitted some code that fill mClassA with data. 
    } 
    return mClassA; 
} 

[編輯]也想問,做FUNC1()和FUNC2的* &()相互抵消?

+2

應該指出,返回一個指針的引用沒有任何意義,而不是返回指針本身。返回指向私人數據的指針本來就是不好的做法。 – Lundin

+0

在主題和標籤中刪除了每個提到的C,因爲C在這個問題中沒有引用。 – Lundin

+1

@Lundin對指針的引用是IMO在這裏很重要,因爲指針可能在func2()中被賦值。其他的解決方案是將指針返回指針。 – marcinj

回答

4
ClassA*& func1() 

返回通過引用在方法內聲明的靜態指針。做:

ClassA*& x = func1() 
x = NULL 

會改變mClassA

ClassA* func2() 

返回指針的副本。它會指向相同的內存,但更改指針不會影響mClassA

0

func1()返回對指針的引用;在實踐中,這意味着它返回的是函數內部使用的相同指針,而不是副本。這樣,如果你改變指針的值(而不是改變它指向的對象的值),你實際上改變了函數內的指針的值。

這是什麼使func2()正常工作。它需要參考func1()中的靜態指針mClassA並在必要時更新其值,然後返回指針的副本;這是一個指向與mClassA相同地址的指針。

0
ClassA*& func1() { 
    static ClassA* mClassA; 
    return mClassA; 
} 

func1()是一種梅耶的單身人士。這與創建全局指針類似。所以,這個函數創建一個指針「對象」,並提供了完整的訪問它,這意味着你可以做這樣的事情:

func1() = new ClassA; 

func2()剛剛返回一個指針的副本。這意味着你不能像上面那樣改變它*

*可以使用新放置來更改尖銳物體。

1

簡而言之:

  • func1提供一個單指針。

  • func2提供了一個類型爲ClassA的單例對象,使用來自func1的單指針作爲實現設備。

您可以更優雅的實現類似的目標是這樣的:

ClassA & getA() 
{ 
    static ClassA impl = initialize_A(); // Or a lambda or just a constructor. 
    return impl; 
} 

這也將清理執行例如在程序結束,按照正確的順序,無需人工破壞。

+0

這是不一樣的,因爲像這樣你不能破壞對象 –

+0

@BЈовић:你是對的,讓我修改它。 –

+0

@BЈовић:基本上:手動生命期 - >指針;永久生命期 - >靜態。 –