2

可能重复:
指针与引用

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

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的实例可以作为指针传递,这在很多书上都有写。我的问题是什么可以被认为是一种好的做法(指针或参考),什么更有效?

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

4

2 回答 2

3

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

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

你会得到一个运行时错误。但错误是因为你在做

myFunction( *0 );

即,因为您要取消引用空指针,而不是因为您要传递零值。实际上,

myFunction( 0 );

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

于 2012-10-15T08:40:45.037 回答
2

这取决于您的需要。

使用指针:

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

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

于 2012-10-15T08:57:29.767 回答