可能重复:
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 的实例可以作为指针传递,许多书中都会写出来。我的问题是什么可以被认为是一种好的做法(指针或参考),什么更有效?
很抱歉,如果以前以某种方式问过这个问题。
答案 0 :(得分:2)
一旦传递了一个值,传递一个引用就是性能明智和语义明智,就像传递一个指针一样。 在您编写的示例中,您传递的是从指针获取的引用,因此引用输入函数施加的限制在此处无效。的确,如果你写了
MyInterface* pObj = 0;
myFunction(*pObj);
您将收到运行时错误。但错误是因为你正在做
myFunction( *0 );
,即因为你解除引用一个空指针,不是因为你传递零值。事实上,
myFunction( 0 );
会给你一个编译时异常(很棒)。
答案 1 :(得分:2)
这取决于你的需要。
使用指针:
否则使用引用。引用更像是变量的别名而不是指向它的指针。这种语义为编译器打开了一些可能的优化,使其比指针更有效。