2015-10-14 43 views
-1

這是一個基本問題,但我不完全明白這一點。 當我有這樣一個功能:字符串作爲C++函數的返回值

string func(){ 
     string result; 
     result = "resultString"; 

     return result; 
} 

這是正確的或者是字符串結果只有一個局部變量(可以走出去的範圍)?

如果可以,爲什麼?這是價值回報嗎?

C++中的哪些類型是通過值返回的?

+3

Google for:[RVO](https://en.wikipedia.org/wiki/Return_value_optimization),移動語義並按值返回 –

+3

你是什麼做得很好。在C++中,所有東西都是以價值回報的。 –

+2

@LukePark除了返回參考。 – juanchopanza

回答

4

這是好的還是字符串結果只是一個局部變量?

這很好。返回的值雖然可能受NRVO約束。

如果可以,爲什麼?這是價值回報嗎?

是。你寫了string作爲返回類型,這意味着一個值。

C++中的哪些類型是通過值返回的?

在C++中,你可以很好地控制它。 string f();表示返回類型爲string的值的函數。 string& f();返回對此值的引用。

-1

如果可以,爲什麼?這是價值回報嗎?

作爲前面答案的補充,我會說結果是一個局部變量;作爲func()原型指定返回是通過值,而不是引用,C++編譯器實際上會調用std :: string拷貝構造函數來初始化func()返回值和結果局部變量的副本(注意,如果沒有提供複製構造你的代碼,C++編譯器將創建一個,它只能實現淺拷貝)

+0

由於NRVO或移動語義,複製構造函數可能不會被調用。在上面的代碼中,最有可能它不會被調用。 – Slava

+0

這是正確的複製構造函數將不會被調用,它取決於編譯器的行爲。 – toubab