일반적으로 초기화하는 경우는 ()를 사용하고
특히, 배열의 경우에서는 {}를 사용한다
추가적으로,
본 내용과는 큰 관련은 없지만
클래스에서의 복사 생성자와 대입 연산자의 차이와 함께
클래스에서의 (), {} 초기화를 알아보자
Knight k1;
Knight k2 = k1;// 복사 생성자
Knight k3;// 기본 생성자
k3 = k1;// 대입 연산자
Knight k4(k3);// () 초기화
Knight k5{k3};// {} 초기화
다시 돌아와서,
중괄호 초기화를 도입함으로써 아래와 같은 장점이 있다
1) vector 등 container와 잘 어울린다
// 소괄호 초기화
vector<int> v1(3, 1);// 3 capacity를 가지고 있고 1로 모두 초기화해라
// 중괄호 초기화
vector<int> v2{3, 1};// 3, 1을 push_back
vector<int> v3{9, 1, 4, 5};// 9, 1, 4, 5를 push_back
2) 축소 변환 방지
int x = 0;
double y{x};// 오류 발생
3) 혼동의 여지를 줄여줌
Knight k1;// 기본 생성자
Knight k2();// 함수 선언하는 문법
Knight k3{};// 기본 생성자
문제점!
클래스 생성자에 initializer_list 버전이 있다면
중괄호를 사용해서 초기화하면 initializer_list 버전이 항상 실행이 된다
Class Knight
{
public:
Knight(int a, int b) { }
Knight(initializer_list<int> li) { }
}
Knight k1{ 1, 2 };// initializer_list 버전이 호출된다
이는 vector도 마찬가지이다
vector의 경우 인자 2개를 받는 버전과 initializer_list 버전이 있는데
중괄호로 두 개의 인자를 넣어 초기화한다면
무조건 initializer_list 버전으로 실행이 된다
vector<int> v1(3, 1);// 3 capacity를 가지고 있고 1로 모두 초기화해라
// 중괄호 초기화
vector<int> v1{3, 1};// 3과 1을 push_back하며 이는 initializer_list 버전으로 생성된 것이다
'C++ > [루키스] Modern C++' 카테고리의 다른 글
[MC++] delete (0) | 2023.07.01 |
---|---|
[MC++] enum class (0) | 2023.06.30 |
[MC++] using (0) | 2023.06.29 |
[MC++] nullptr (0) | 2023.06.29 |
[MC++] auto (0) | 2023.06.29 |