소괄호 초기화와 중괄호 초기화의 차이점을 설명해 주세요 {C++11}
- 0012 Career 💼
- cppreference.com / list_initialization
- modoocode.com / C++ 유니폼 초기화 (Uniform Initialization)
- mariusbancila.ro / C++17 New Rules For auto Deduction From braced-init-list
소괄호 초기화는 C++11에 도입된 초기화 방법입니다. 암시적인 형변환을 막고 기존의 함수의 정의처럼 보이는 초기화 문제를 해결했습니다.
std::initializer_list와 혼동이 올 수 있는데 어떤 차이가 있나요?#
C 배열을 초기화할 때 사용하는 문법 그대로 컨테이너들을 간단하게 초기화할 수 있습니다. 하지만 uniform initialization과 모양이 흡사하기 때문에 컨테이너 타입 객체를 초기화할때 주의해야 합니다.
벡터 생성자의 첫번째 인자로 size_type count
가 있는데, 소괄호 생성자를 사용하면 count 개수만큼의 공간을 할당받아놓고, 중괄호 생성자를 사용하면 원소 하나짜리 벡터가 만들어지게 됩니다. 왜냐면 원소 한개짜리 initializer_list라고 생각하기 때문입니다. C++은 중괄호 연산자에 대하여 initializer_list를 받는 생성자가 최우선으로 고려된다고 합니다.
초기화의 종류#
-
출처 : mariusbancila.ro / C++17 New Rules For auto Deduction From braced-init-list
-
default initialization: std::string s;
- value initialization: std::string s{};
- direct initialization: std::string s("demo");
- copy initialization: std::string s = "demo";
- list initialization: std::string s{'d', 'e', 'm', 'o'};
- aggregate initialization: char s[5] = {'d', 'e', 'm', 'o'};
- reference initialization: char& c = s[0];