2012-07-14 96 views
0

可能重复:
C++ functions: ampersand vs asterisk
What are the distinctions between the various symbols (*,&, etc) combined with parameters?差异呼吁

我想知道地址运营商&,并在尊重运营商*之间的区别一个C++函数调用。例如采取以下功能

void foo (std::string& param) 
{ 
    param = "Bar."; 
    std::cout << param.size(); 
} 

,让我们把它在我们像这样main()功能...

int main() 
{ 
     std::string test; 
     foo(test);   //Why not foo(&test)? 
     std::cout << test; //Prints out the value "Bar." 
} 

首先,为什么&运营商允许我分配一个值,如果它是一个指针(当它不是一个指针时,为它指定一个可以存活RAII的值和函数范围foo()),因为它可以在我的main()函数中打印出来,即使它不是static?我假设它不是指针,因为我可以通过使用.运算符而不是用于指针的->来访问size()方法。

其次,在函数参数中使用&运算符与使用运算符*之间有什么区别?它不仅仅是一个简单的变量,如std::string param?它似乎是这样调用的(foo(test)而不是foo(&test))。

+0

仔细看看C++ *参考*。 – mavam 2012-07-14 19:36:27

+0

这不是一个操作员,它是一个参考。 – Dani 2012-07-14 19:36:45

+0

http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c – chris 2012-07-14 19:37:18

回答

2

&功能参数明确表示此参数被传递,通过参考(大多数编译器实现这个作为一个指针),这就是为什么你看到这个任务在你main()效果。 static与此无关。

在声明一个参数使用&*的功能不同的是,第二个允许NULL(或一个不存在的或只是一个普通的无效地址)是传入的同时&保证有一个真正的对象被这个函数的参数引用。除此之外,两者都提供了类似的功能,允许通过原始对象的引用来改变原始对象。

0

test自己(没有&)会传递一个副本到函数的字符串,而&意味着它会传递一个引用。

仅供参考:如果您不需要参考,最佳实践会指示将所有对象作为常量参考传递。