我有一些使用接口指针的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参数使用引用指针而不是指针指针是否有优势?
答案 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 ++实现中表示相同(这是实现细节,但不是标准的一部分。也是它对指针的引用,而不是指向引用的指针,你不能创建指向引用的指针