2015-02-08 101 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++關於如何傳遞函數的參數。