2012-10-15 99 views
0

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

对不起,如果这个问题以前曾问过。

+6

有了参考资料,你可以让读者清楚它们不能传递null。性能没有差别。 – avakar

+0

但是,如果0作为参数传递,这会导致运行时错误,我错了吗? – besworland

+0

'MyClass'中的'f'不应该被'虚拟'去掉吗? – halex

回答

2

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

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

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

myFunction(*0); 

即,因为你是提领一个空指针,不是因为你是传递零值。其实,

myFunction(0); 

会给你一个编译时异常(这是很好的)。

+0

谢谢你的回复。 – besworland

2

这取决于你的需要。

使用指针:

  • 如果有过,你可以想如果你想通过“无对象”
  • 一个机会,如果你想在传递指针指向不同的位置
  • 能力得到指针变量的地址出于某种原因

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

+0

你提到效率不错!这正是我想听到的! +1谢谢。 – besworland