const std :: string賦值/聲明中最適合什麼?使用構造函數(例如,const std::string WORD("hello");
)或使用相等的運算符(例如const std::string WORD= "hello";
)? 這些東西在內存使用情況或時間流程上有差異嗎?C++ const std :: string賦值
2
A
回答
2
對於任何合理的編譯器,生成的代碼在兩種情況下都是相同的。在這種情況下是否應該使用直接初始化或複製初始化基本上是基於意見的。
0
在這兩種情況下,通常編譯器都會使用"Return Value Optimisation"刪除副本。查看ideone here調用該代碼既不是普通的構造函數,也沒有賦值運算符,因爲它不打印他們被調用屏幕:
即:
#include <iostream>
class C
{
public:
C() {}
C(const char[]) { std::cout << "Ordinary Constructor" << std::endl; }
C& operator=(const char[]) { std::cout << "Assignment Operator" << std::endl; return *this; }
};
int main() {
std::cout << "Start" << std::endl;
C x1 = "Hello";
C x2("Hello");
std::cout << "End" << std::endl;
}
只是輸出:
Start
End
它不輸出:
Start
Assignment Operator
Ordinary Constructor
End
由於C + +允許跳過副本並臨時構建到位。
+1
它不會在這裏調用賦值操作符,因爲x1和x2都被初始化,它們不被賦值。 – kraskevich 2014-10-17 03:33:38
+0
'C x1 =「Hello」;'表示拷貝構造函數,不是賦值操作符 – 2014-10-17 03:39:25
0
的線條:
std::string x = "hello";
std::string x("hello");
都只會調用std::string
構造。也就是說,它們是相同的,都不會使用operator=
重載。
相關問題
- 1. memset導致std :: string賦值崩潰
- 2. GCC 4.9 std :: string const char *
- 3. 運算符std :: string()const?
- 4. 從「std :: istringstream」初始化「const std :: string」
- 5. 爲什麼std :: runtime_error :: what()返回const char *而不是std :: string const&
- 6. C++ std :: string到布爾值
- 7. C++循環std :: vector <std :: map <std :: string,std :: string>>
- 8. 在std :: string :: assign(std :: string const&)中的分段錯誤
- 9. C++ std :: string和string
- 10. Const C++函數中的賦值
- 11. C++爲const QList賦值if ... else
- 12. 如何在std :: string中存儲const char *?
- 13. 如何在std :: string中存儲const char * []?
- 14. 可以CString :: Format()接收const std :: string?
- 15. 如何獲得const string&的值在C++
- 16. C++ std :: string到Ruby VALUE
- 17. C++傳遞字符串而不是const std :: string&?
- 18. 跳過賦值爲const
- 19. 哪一個使用const char []或const std :: string?
- 20. Cython C++和std :: string
- 21. 爲std :: string賦值double - 沒有編譯錯誤?
- 22. 無法在賦值語句中將'int(B :: *)(std :: string)'轉換爲'int(*)(std :: string)'pt2function =&B :: generate_callback;
- 23. std :: string和stdarg.h
- 24. const string與#define
- 25. boost :: format表單c-string或std :: string
- 26. C++/CX:將std :: string轉換爲Platform :: String^
- 27. 使用std :: sscanf和std :: string的C++
- 28. g ++編譯器錯誤對已刪除賦值操作符<string,string>
- 29. 將常量參數的const char *成員賦值爲新值
- 30. const指針作爲類字段賦值
在這裏試一試並比較生成的程序集http://gcc.godbolt.org/ – 2014-10-17 02:21:58
兩者都使用構造函數。在你顯示的代碼中沒有賦值,也沒有'operator ='。 – chris 2014-10-17 02:40:33
[複製初始化和直接初始化之間C++有差異嗎?](http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization- and-direct-initializati) – Galik 2014-10-17 03:12:40