2011-12-07 117 views
4

我有一點使用接口指針的COM代碼。的返回一個接口指針這樣的代碼實現的功能原作者:的指針指針與參考指針之間的區別(C++)

HRESULT Query (IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator); // (1) 

代替傳統

HRESULT Query (IN BSTR sQuery, OUT IEnumWbemClassObject** ppEnumerator); // (2) 

的功能(1)被稱爲是這樣的:

hRes = Query (sQuery, pEnumerator); // (3) 

這絕對是看起來錯了,但它工作正常。我不確定是否只是選擇了這一行,因爲out參數不是指向輸出變量的指針,或者因爲此方法有問題。

使用引用指針而不是指針指向out參數有什麼好處嗎?

+3

你應該明白'T *'和'T&'之間的區別,那麼理解'T'可以是一個指針類型。 – GManNickG

+2

¤在有效程序中,引用不能是空引用。所以它防止錯誤的使用,*假設只使用C++ *簡化了實現。然而,儘管COM設計時考慮了C++用法(COM對象的內存佈局直接是早期Visual C++製作的內存佈局),但COM與語言無關。所以當這個方法在C中被使用時,下面的指針指針就會被顯示出來,並且C客戶端可能會輕鬆地傳遞一個空指針。因此,如果要支持其他語言的用法,則參考不會簡化。但它更清楚。乾杯&hth。, –

+0

嗯,對不起,通過修正標題和最後一段,最初稱爲「指針參考」來搞亂隊列中的答案。 –

回答

3

第一個例子是參考指針的,即,一類IEnumWbemClassObject*參考:

HRESULT Query (IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator); 

因此,如果pEnumerator聲明爲IEnumWbemClassObject*(這我假設它是),你不需要的pEnumerator地址明確地傳遞給函數或取消引用變量在函數內部以便更改pEnumerator點(否則將需要使用參數IEnumWbemClassObject**)。

的引用指針具有相同的行爲,以任何其他類型的引用,只是認爲上述例子的作爲一「參照指針」一個「指針的引用。 「不存在指向參考的指針。

+0

非常感謝您的詳細解釋。雖然所有的答案都表達了幾乎相同的東西,但這個最詳細。感謝所有其他人以及他們的解釋:我想我對*&vs **的不喜歡僅僅來自傳統和偏好。 – xxbbcc

1

它是因爲指針和引用在正常的C++實現中表現相同(但是這是實現細節,不是標準的一部分,也是它對指針的引用,而不是指向引用的指針,所以不允許創建指向參考的指針。所有

+0

好的 - 我不知道創建指向引用的指針是不允許的。 – xxbbcc

2

這是更好地認爲類型 &富*作爲一個指針,而不是周圍的其他方式的參考,因爲它不再意味着你可以修改通過指針和其他類似C++的參考 - 破這也使得這個函數的調用變得更容易相信,因爲它就像通過引用傳遞其他東西一樣,不需要提取引用或者特殊符號。

4

的優點是相同的任何使用的引用,而不是指針:

  • 簡單
  • 引用不能爲空,所以分配給在Query參考不會引起訪問衝突

請注意原始描述有誤:IEnumWbemClassObject* &是對指針的引用,而不是指向引用的指針。