2013-03-13 3 views
7

문자열을 100 A 자로 만들어야합니다.C++ 11 문자열 초기화

이유는 다음

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

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

과 다른 결과를 제공합니까?

+1

문자열을 생성

string (size_t n, char c); 

을, 단순히 '()'을 '{}'로 대체하십시오. 당신은'std :: string myString {100, 'A'};' –

+1

@CrazyEddie를 수행해야합니다. 그러나 이것은 대괄호 안에있는 변경이 프로그램의 동작을 근본적으로 바꿀 위치의 예입니다. 'initializer_list' 생성자는 다른 것들보다 우선합니다. '= '기호는 여기서 아무런 차이가 없습니다. [데모보기] (http://ideone.com/VxAQUY). – juanchopanza

+1

@CrazyEddie 어떻게 차이가 있습니까? 결과는 여전히'std :: string myString (100, 'A'); ' – Praetorian

답변

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

은 초기화 목록을 사용한 초기화입니다. 그것은 2 개 문자 문자열을 생성합니다 : 코드 (100)와 하나 'A'

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

다음 생성자 호출 보편적 초기화 100 'A의

+5

형식적으로 첫 번째 인수는 단순히 값 100을 갖는'char' 일뿐입니다. 시스템이'char' 값을 ASCII로 취급한다면 그것은 ASCII입니다. 이는 매우 일반적인 것이지만 C++ 언어 정의에서는 필수 사항이 아니며 사실이 아닌 시스템이 있습니다. –

+0

@Fanael - 나는 그것이 얼마나 힘들 었는지 모르지만, 종종 간과되는 중요한 점이며, 단순히 텍스트를 편집한다고해서 사람들에게 상기시켜주는 것은 아닙니다. –

+0

@PeteBecker :'std :: string s = {100, 'A'};'는 정의되지 않은 동작입니까? C++ 11에서 유니폼 이니셜 라이저 구문을 만들려는 의도를 대부분 무효화하지 않겠습니까? –

1

첫 번째 값은 100과 A의 값으로 초기화되고 두 번째는 std::string의 생성자 오버로드를 호출합니다.

+3

예, 해당 생성자는 100 개의 'A'문자가있는 문자열을 제공합니다. – juanchopanza