指针指针与指针指针(C ++)之间的区别

时间:2011-12-07 23:27:10

标签: c++ pointers com out

我有一些使用接口指针的COM代码。代码的原始作者实现了返回接口指针的函数,如下所示:

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参数使用引用指针而不是指针指针是否有优势?

4 个答案:

答案 0 :(得分:4)

优点与使用引用而不是指针相同:

  • 简单
  • 引用不能为空,因此分配给Query中的引用不会导致访问冲突

请注意原始描述有误:IEnumWbemClassObject* &是对指针的引用,而不是指向引用的指针。

答案 1 :(得分:4)

第一个例子是对指针的引用,即。类型IEnumWbemClassObject*的引用:

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

因此,如果将pEnumerator声明为IEnumWbemClassObject*(我假设它是),则无需将pEnumerator的地址显式传递给函数或取消引用函数内部的变量,以便更改pEnumerator点的位置(IEnumWbemClassObject**的参数可能需要这些点。)

对指针的引用与对任何其他类型的引用具有相同的行为,只需将上述示例视为“对指针的引用”一个“指向引用的指针。” 没有指向引用的指针。

答案 2 :(得分:2)

最好考虑 Type & foo *作为指针的引用而不是相反的方式,因为它不再暗示你可以通过指针和其他类似的C ++来破坏引用。它还使得函数调用更容易相信,因为它就像通过引用传递任何其他东西一样,不需要解除引用或特殊符号。

答案 3 :(得分:1)

因为指针和引用在普通的c ++实现中表示相同(这是实现细节,但不是标准的一部分。也是它对指针的引用,而不是指向引用的指针,你不能创建指向引用的指针