将接口引用为参数

时间:2012-10-15 08:23:44

标签: c++

  

可能重复:
  Pointer vs. Reference

我想知道在某些界面上使用引用而不是指针是否有任何好处。更具体的是,让我们考虑小例子:

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();
}

myFunction MyClass 的实例可以作为指针传递,许多书中都会写出来。我的问题是什么可以被认为是一种好的做法(指针或参考),什么更有效?

很抱歉,如果以前以某种方式问过这个问题。

2 个答案:

答案 0 :(得分:2)

一旦传递了一个值,传递一个引用就是性能明智和语义明智,就像传递一个指针一样。 在您编写的示例中,您传递的是从指针获取的引用,因此引用输入函数施加的限制在此处无效。的确,如果你写了

MyInterface* pObj = 0;
myFunction(*pObj);

您将收到运行时错误。但错误是因为你正在做

myFunction( *0 );

,即因为你解除引用一个空指针,不是因为你传递零值。事实上,

myFunction( 0 );

会给你一个编译时异常(很棒)。

答案 1 :(得分:2)

这取决于你的需要。

使用指针:

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

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