8

我有一些使用接口指针的 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

4 回答 4

7

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

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

因此,如果pEnumerator声明为 a IEnumWbemClassObject*(我假设它是),您不需要显式地将地址传递pEnumerator给函数或取消引用函数内部的变量以更改位置pEnumerator点(否则将需要)的一个论点IEnumWbemClassObject**

对指针的引用与对任何其他类型的引用具有相同的行为,只需将上面的示例视为“对指针的引用”而不是“对引用的指针” 没有指向引用的指针这样的东西。

于 2011-12-07T23:33:48.347 回答
5

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

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

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

于 2011-12-07T23:32:49.133 回答
2

最好将Type & foo* 视为对指针的引用,而不是相反,因为它不再意味着您可以通过指针和其他此类破坏 C++ 的想法来修改引用。它还使该函数调用更容易相信,因为它就像通过引用传递任何其他内容一样,不需要取消引用或特殊符号。

于 2011-12-07T23:31:50.127 回答
1

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

于 2011-12-07T23:31:46.700 回答