當函數返回字符串的時候,我們可以定義返回string和string&。
1寫一個返回string引用的函數
std::string & TestStringReference()
{
std::string loal_str = "holy shit";
return loal_str;
}
這個函數當然是錯誤的,編譯器會提示我們:
返回局部變量或臨時變量的地址: loal_str
即不能返回局部變量的引用。
2寫一個返回string的函數(函數返回局部變量string的時候能不能被引用?)
std::string TestStringReference()
{
std::string strTest = "This is a test.";
return strTest;
}
那麼對於上述函數的返回值可以被引用嗎?
代碼說話:
#include
#include
std::string TestStringReference()
{
std::string strTest = "This is a test.";
return strTest;
}
int main()
{
std::string& strRefer = TestStringReference();
std::cout << "strRefer:" << strRefer << std::endl;
return 0;
}
代碼 完美運行。
實際上返回的不是局部變量,而是編譯器新構造的臨時對象。
3返回string的函數直接調用.c_str()
上面說了,返回的“局部”string可以被引用的,那麼返回的“局部”string直接調用.c_str()會有什麼效果恩?
#include
#include
std::string TestStringC_STR()
{
std::string strTest = "This is a test.";
return strTest;
}
int main()
{
const char *pc = TestStringC_STR().c_str();
std::cout << pc << std::endl;
return 0;
}
上面代碼編譯器不會報錯!
但是等等,別高興太早,看看輸出結果,為空,不是我們期望的。
關鍵是,我們沒有將TestStringC_STR()的結果賦給一個string對象就直接獲取其指針了,這時,系統並不會為string調用拷貝構造函數或是賦值函數,返回的string仍然只是一個臨時對象的狀態,它會在完成對pc的賦值後被銷毀,這時其內部的數據也不會存在了。
解決方法:先用一個string接收函數的返回值,然後再調用c_str()方法:
#include
#include
std::string TestStringC_STR()
{
std::string strTest = "This is a test.";
return strTest;
}
int main()
{
std::string str1 = TestStringC_STR();
const char *pc = str1.c_str();
std::cout << pc << std::endl;
return 0;
}