回答
是和
首先是明確初始化號,第二個是拷貝初始化。該標準允許用第一個替換第二個。實際上,生成的代碼是相同的。
下面是簡而言之會發生什麼:
std::string s1("foo");
形式的字符串構造:
string (const char * s);
被調用s1
。
在第二種情況下。創建一個臨時對象,併爲該臨時對象提供所述的構造函數。然後,複製構造函數被調用。例如:
string s1 = string("foo");
在實踐中,第二種形式被優化,成爲第一種形式。我還沒有看到一個不優化第二種情況的編譯器。
沒有區別
第一個比較好。
第二個將創建實例並將分配默認值(「」)。然後會有一個secodn分配:「foo」。 所以2的作業,而不是1 ...
不,第二個不會調用賦值運算符。 – 2010-02-03 13:48:32
表面上,第一個調用const char*
構造函數來初始化s1
。第二個使用const char*
構造函數初始化一個臨時值,然後使用複製構造函數傳入對該臨時值的引用,以初始化s2
。
然而,標準明確允許所謂的「複製省略」,這意味着,阿拉克說,第二個可以合法地與第一更換,即使拷貝構造函數具有可觀察到的副作用,這樣的變化影響程序的輸出。
但是,當這個替換完成後,編譯器仍然必須檢查該類是否有可訪問的拷貝構造函數。所以一個潛在的區別是第二種形式需要一個拷貝構造函數來調用,即使編譯器不需要調用它。很明顯std::string
確實有一個,所以在這種情況下,這並沒有什麼區別,但對於其他類可以。
你得到了我的+1「標準明確允許所謂的」複製elision「;) – AraK 2010-02-03 14:03:09
小招供:在發佈後,我注意到它是在索引中的」複製構造函數elision「,但據我記得我已經提到它作爲「複製elision」:-) – 2010-02-03 18:04:53
- 1. 初始化字符串時'...'和「...」有什麼區別?
- 2. 用=初始化和用{}初始化有什麼區別?
- 3. 這兩種初始化字符串的方式有什麼區別?
- 4. 這兩種初始化方式之間有什麼區別字符串
- 5. 用於初始化空字符串的「」和{}之間有什麼區別?
- 6. Ruby:使用引號初始化字符串與冒號有什麼區別?
- 7. 在C#中。字符串和字符串有什麼區別?
- 8. C字符串和C++字符串有什麼區別?
- 9. 初始化字典和在Swift中聲明有什麼區別?
- 10. Java中靜態初始化和動態初始化有什麼區別?
- 11. 在下一步中聲明和初始化的初始化有什麼區別?
- 12. 在.NET中初始化字符串和不初始化字符串之間的區別
- 13. C中的字符串初始化
- 14. 爲什麼字符串需要用初始值初始化?
- 15. 在C#中的區別是什麼:字符串VS字符串
- 16. 使用字符串文字和不同字符列表初始化數組聲明時有什麼區別?
- 17. 不初始化指針並將其初始化爲null會有什麼區別?
- 18. 初始化字符緩衝區在C++
- 19. 兩個字符串有什麼區別?
- 20. 字符串,CString,QString有什麼區別?
- 21. golang中的[]字符串和...字符串有什麼區別?
- 22. Python字符串格式化中%s和%d有什麼區別?
- 23. 打印和格式化字符串文字有什麼區別?
- 24. 是什麼在C#初始化和賦值的區別
- 25. char []和C++中的字符串有什麼區別?
- 26. 在C中創建字符串的方法有什麼區別?
- 27. C++的初始化字符串指針
- 28. 用argv初始化C++字符串
- 29. C++ 11字符串初始化
- 30. 的C#初始化字符串數組
拷貝構造函數不會在第二種情況下被調用,只會調用字符串(const char * s)。這是複製初始化。檢查:[how-c-implicitly-convert-c-style-string-to-a-string-object](http://stackoverflow.com/questions/35568612/how-c-implicitly-convert-c-style-字符串到字符串對象) – expoter 2016-02-23 05:36:09