程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 實戰c++中的string系列--函數返回局部變量string(引用局部string,局部string的.c_str()函數)

實戰c++中的string系列--函數返回局部變量string(引用局部string,局部string的.c_str()函數)

編輯:C++入門知識

實戰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
#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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved