2011-12-07 179 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* &是对指针的引用,而不是指向引用的指针。