2013-03-13 122 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