C++ 接口上的引用作为参数

C++ 接口上的引用作为参数,c++,C++,可能重复: 我想知道在某些接口上使用引用而不是指针是否有好处。更具体地说,让我们考虑一个小例子: struct MyInterface { virtual ~MyInterface() {} virtual void f() = 0; }; class MyClass : public MyInterface { virtual void f() { std::cout << "F()" << std::endl; } };

可能重复:

我想知道在某些接口上使用引用而不是指针是否有好处。更具体地说,让我们考虑一个小例子:

struct MyInterface {
   virtual ~MyInterface() {}
   virtual void f() = 0;
};

class MyClass : public MyInterface
{
   virtual void f()
   {
      std::cout << "F()" << std::endl;
   }
};


void myFunction(MyInterface& obj);

int main(int argc, char *argv[])
{
   MyInterface* pObj = new MyClass;

   myFunction(*pObj);

   delete pObj;

   getchar();
   return 0;
}

void myFunction(MyInterface& obj)
{
   obj.f();
}
struct-MyInterface{
虚拟~MyInterface(){}
虚空f()=0;
};
类MyClass:公共MyInterface
{
虚空f()
{

std::cout一旦传递了一个值,传递一个引用在性能和语义上都与传递一个指针相同。 在您编写的示例中,您正在传递从指针获得的引用,因此引用输入函数施加的限制在此无效

MyInterface* pObj = 0;
myFunction(*pObj);
您将得到一个运行时错误。但该错误是因为您正在执行

myFunction( *0 );
i、 例如,因为您正在解引用空指针,而不是因为您正在传递零值。事实上

myFunction( 0 );

将给您一个编译时异常(非常好)。

这取决于您的需要

使用指针:

  • 如果有机会你想通过“无对象”
  • 如果希望能够将传递的指针指向不同的位置
  • 如果出于某种原因想要获取指针变量的地址

else使用引用。引用更像是变量的别名,而不是指向它的指针。这种语义为编译器打开了一些可能的优化,并使其比指针更有效。

对于引用,您向读者清楚地表明它们不能传递null。性能上不会有任何差异。但是如果0作为参数传递,则meter,这将导致运行时错误,我错了吗?是否应该在
MyClass
中的
f
处删除
virtual
?@besworland,有引用的话,你根本不能通过0。有指针的话,是的,当调用第一个虚拟函数时,代码可能会崩溃。@avakar Yeap,刚刚尝试过:)谢谢。谢谢你的回复。很好,你提到了效率!这正是我想听到的!+1谢谢。