2013-03-13 153 views
7

我需要創建一個字符串100 A字符。C++ 11字符串初始化

爲什麼以下

std::string myString = {100, 'A'}; 

得到不同的結果比

std::string myString(100, 'A'); 

+1

對於通用的初始化字符串,只需用'{}'替換'()'即可。你應該做'std :: string myString {100,'A'};' – 2013-03-13 16:25:00

+1

@CrazyEddie,但這是一個例子,括號內的改變會從根本上改變程序的行爲。 'initializer_list'構造函數優先於其他所有構造函數。 '='符號在這裏沒有區別。 [見演示](http://ideone.com/VxAQUY)。 – juanchopanza 2013-03-13 16:37:45

+1

@CrazyEddie這有什麼區別?結果仍然不是'std :: string myString(100,'A');' – Praetorian 2013-03-13 16:38:42

回答

14
std::string myString = {100, 'A'}; 

是初始化使用初始化列表。它創建了2個字符的字符串:一個與代碼100和 'A'

std::string myString(100, 'A'); 

調用下面的構造:

string (size_t n, char c); 

這將創建100「A的

+5

形式上,第一個參數僅僅是一個值爲100的char;如果你的系統把'char'值視爲ASCII,那麼它就是ASCII碼。雖然這很常見,但它不是C++語言定義所要求的,有些系統並非如此。 – 2013-03-13 16:22:24

+0

@Fanael - 我不知道它有多難,但這是一個經常被忽視的重要問題,只是編輯文本並沒有提醒人們。 – 2013-03-13 16:26:25

+0

@PeteBecker:這是否意味着'std :: string s = {100,'A'};'是未定義的行爲?這不會使C++ 11中創建統一初始化語法的大多數意圖無效嗎? – 2013-03-13 16:32:00

1

第一次初始化爲100和A,第二次調用構造函數重載std::string

+3

是的,該構造函數會給你一個帶有100個「A」字符的字符串。 – juanchopanza 2013-03-13 16:19:59