##實戰c++中的string系列--函數返回局部變量string(引用局部string,局部string的.c_str()函數)
當函數返回字符串的時候,我們可以定義返回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<iostream>
#include<string>
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<iostream>
#include<string>
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<iostream>
#include<string>
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;
}
~~~
- 前言
- string與整型或浮點型互轉
- 指定浮點數有效數字并轉為string
- string的替換、查找(一些與路徑相關的操作)
- string的分割、替換(類似string.split或是explode())
- string的初始化、刪除、轉大小寫(construct erase upper-lower)
- string的遍歷(使用下標還是iterator)
- std::string與MFC中CString的轉換
- string到LPCWSTR的轉換
- std:vector<char> 和std:string相互轉換(vector to stringstream)
- CDuiString和string的轉換(duilib中的cduistring)
- string的連接(+= or append or push_back)
- 函數返回局部變量string(引用局部string,局部string的.c_str()函數)
- 將string用于switch語句(c++做C#的事兒, switch中break還是return厲害)
- 不要使用memset初始化string(一定別這么干)