2015-02-08 50 views
0

我想声明一个字符串,通过引用传递它来初始化它,然后通过值将其传递给'outputfile'函数。在C++中通过引用和值传递字符串

下面的代码工作,但我不知道为什么。在主我希望通过字符串“文件名”像

startup(&filename) 

但是,这给出了一个错误,而下面的代码则不会。为什么?另外,有没有更好的方式来做到这一点,而不使用返回值?

#include <iostream> 
#include <string> 
using namespace std; 
void startup(std::string&); 
void outputfile(std::string); 
int main() 
{ 
    std::string filename; 
    startup(filename); 
    outputfile(filename); 
} 
void startup(std::string& name) 
{ 
    cin >> name; 
} 
void outputfile(std::string name) 
{ 
    cout << name; 
} 
+1

'&filename'创建一个指针。指针和引用不兼容。 – 2015-02-08 05:28:35

+0

为什么你不想使用返回值? – 2015-02-08 05:35:19

+0

代码“起作用”,因为它完全符合您所描述的内容。在你的开头句中,并且做得很好。关于'&filename'错误,它不应该编译,因为引用不是一个指针。见[这个问题和答案](http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in)。关于他们的差异和相似之处。 – WhozCraig 2015-02-08 05:42:53

回答

3

您的代码按预期工作。

&filename返回内存地址(又名指针)filename,但startup(std::string& name)需要引用,而不是指针。

参考在C++只是与正常“通按值”语法传递:

startup(filename)通过引用采取filename


如果修改了startup功能采取的指针std::string代替:

startup(&filename)

void startup(std::string* name)

,那么你会使用运营商的地址的传递


另外,还应该使outputfile函数通过引用来引用其参数,因为不需要复制字符串。而且,由于你不修改参数,你应该把它作为一个参考const

void outputfile(const std::string& name) 

欲了解更多信息,here are the rules of thumb for C++关于如何传递函数的参数。