1. 程式人生 > 其它 >C++引用用於 string 物件的案例

C++引用用於 string 物件的案例

技術標籤:c++

C++ Primer Plus給出了將類物件傳遞給函式時使用引用的幾種典型的方法,包括效果完全不同的三個函式,程式如下:

#include <iostream>
#include <string>
using namespace std;

string version1(const string & s1, const string & s2);
const string & version2(string & s1, const string & s2);
const string & version3
(string & s1, const string & s2); int main() { string input; string copy; string result; cout << "Enter a string: "; getline(cin, input); copy = input; cout << "Your string as entered: " << input << endl; result = version1(input, "***"
); cout << "Your string enhenced: " << result << endl; cout << "Your original string: " << input << endl; result = version2(input, "###"); cout << "Your string enhenced: " << result << endl; cout <<
"Your original string: " << input << endl; cout << "Resetting original string." << endl; input = copy; result = version3(input, "@@@"); cout << "Your string enhenced: " << result << endl; cout << "Your original string: " << input << endl; system("pause"); return 0; } string version1(const string & s1, const string & s2) { string temp; temp = s2 + s1 + s2; return temp; } const string & version2(string & s1, const string & s2) { s1 = s2 + s1 + s2; return s1; } const string & version3(string & s1, const string & s2) { string temp; temp = s2 + s1 + s2; return temp; }

程式執行情況如下:
顯示結果後程序崩潰
前兩個函式可以正常執行,第三個函式執行時程式崩潰。

version1() 和 version3() 中均定義了一個新的 string 物件 temp,只在函式中有效,函式執行完畢後將不再存在,因此返回指向 temp 的引用不可行,故函式返回型別應當為 string,這意味著 temp 的內容將被複制到一個臨時儲存單元中,然後在 main() 中,該儲存單元的內容被複制到一個名為 result 的string 中。故應當使用 version1() 的返回的值型別,而不應當使用 version3() 返回的引用型別。

version2() 不建立臨時 string 物件,而是直接修改原來的 string 物件。但若要求保留原來的字串不變,將會成為一種錯誤的設計。