C++ 指向指针的指针与指向指针的引用之间的差异(C+;+;)

C++ 指向指针的指针与指向指针的引用之间的差异(C+;+;),c++,pointers,com,out,C++,Pointers,Com,Out,我有一些使用接口指针的COM代码。代码的原始作者实现了返回如下接口指针的函数: HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator ); // (1) hRes = Query ( sQuery, pEnumerator ); // (3) 而不是传统的 HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject** ppEnumerator

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

HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator ); // (1)
hRes = Query ( sQuery, pEnumerator ); // (3)
而不是传统的

HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject** ppEnumerator ); // (2)
函数(1)的调用方式如下:

HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator ); // (1)
hRes = Query ( sQuery, pEnumerator ); // (3)
这看起来肯定是错的,但效果很好。我不确定是因为out参数不是指向输出变量的指针,还是因为这种方法有问题,所以我才选择这一行


< P>有一个优点是使用指针指向指针而不是指针指向out参数?

它,因为指针和引用在普通C++实现中是相同的。(但这是实现细节,不是标准的一部分。此外,它对指针的引用,而不是指针对引用,您根本不允许创建指针对引用。

最好将Type&foo*视为对指针的引用,而不是相反,因为它不再意味着您可以通过h指针和其他类似的C++突破性想法。这也使函数调用更容易相信,因为它就像通过引用传递其他任何东西一样,不需要解引用或特殊符号。

其优点与使用引用而不是指针是一样的:

  • 简朴
  • 引用不能为null,因此在
    查询中分配给引用不会导致访问冲突

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

第一个示例是指向指针的引用,即指向类型
IEnumWbemClassObject*

HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator );
因此,如果
pEnumerator
被声明为
IEnumWbemClassObject*
(我假设是这样),您不需要显式地将
pEnumerator
的地址传递给函数,也不需要取消引用函数中的变量来更改
pEnumerator
点的位置(如果参数为
IEnumWbemClassObject**
,则需要该参数)


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

啊,好吧-我不知道创建指向引用的指针是不允许的。您应该了解
t*
t&
之间的区别,然后只了解
t
可以是指针类型。·引用在有效程序中不能是空引用因此,它防止了错误的使用,并且假设C++的使用只简化了实现。然而,COM是用C++使用的设计的(COM对象的内存布局直接是早期VisualC++产生的),COM是独立于语言的。因此,当该方法在C中使用时,下面指向指针的指针会显示出来,C客户机可能会很容易地传递空指针。因此,如果要支持其他语言使用,引用不会简化。但更清楚。谢谢,嗯,很抱歉,fi把队列中的答案弄乱了标题和最后一段,最初是“指向参考的指针”。非常感谢您的详细解释。虽然所有答案都说了几乎相同的事情,但这一段最为详细。感谢所有其他人的解释:我想我不喜欢*&vs**仅仅是因为传统和偏好。