프로그래밍 언어 공부/C++

[Modern C++] 중괄호 초기화 { }

설탕중독 2022. 7. 14. 20:29

 

[Modern C++] 중괄호 초기화 { }

 

기본적으로 중괄호 초기화는 그리 어렵지 않다.

기존에 있던 문법에서 하나가 추가되었을 뿐이다.

 

1-1. 예시

1-1 이미지와 같이 C++11에서는 중괄호로 초기화하는 것이 추가되었다.

기존에는 vector 같은 컨테이너를 초기화할 때 중괄호를 사용할 수 없었지만 C++11에서 추가된

중괄호 초기화 덕분에 vector 또한 배열처럼 중괄호를 이용해서 한 번에 초기화가 가능해졌다.

 

 

2-1. vector 중괄호 초기화 사용

보는 바와 같이 기존에는 push_back이나 일반 괄호를 통해 초기화를 해주었지만 

중괄호 초기화 기능을 통해 일반 배열처럼 초기화가 가능해졌다.

 

 

중괄호 초기화 장점 정리

1. vector 등 컨테이너와 잘 어울린다.

2. 축소 변환을 방지한다.

    // 데이터 타입이 변환되는 과정에서 데이터 손실 등 무의식적으로 실행되던 코드들을 방지해준다.

 

 

물론 이러한 중괄호 초기화도 장점만 있는 것은 아니다. 단점 또한 존재하는데 조금 

문법적으로 알아야 할 것이 있다.

 

클래스나 컨테이너 등에서 중괄호 초기화를 사용해서 초기화를 해주면

initializer_list 타입의 생성자가 호출된다. 문제는 initializer_list 타입의 생성자의 우선순위가 매우 높아서

발생하는데 좀 더 쉽게 예시를 들어보겠다.

 

 

3-1. 단점 예시

우선 3-1 이미지와 같이 a 클래스를 명시적으로 만들어주었다.

그리고 기본 생성자와 정수 두 개를 받아주는 생성자, 마지막으로 initializer_list 타입의 생성자를 만들었다.

 

 

3-2. 단점 예시

그리고 메인 함수내에서 중괄호 초기화를 이용해 정수 데이터 두 개를 초기화하는 코드를 넣어주었다.

 

문제는 지금부터이다. 

사용자는 정수 두 개를 받아주는 생성자를 호출하기 위해 중괄호 초기화 기능을 이용하여 정수 두 개를

넣어주었지만 실행 되는 생성자는 initializer타입의 생성자가 호출된다. 그 이유는 위에서도 설명했듯이 

initializer의 우선순위가 매우 높기 때문에 다른 생성자를 무시하고 initializer 생성자가 호출되는 것이다.

 

이러한 문제들 때문에 중괄호 초기화 또한 만능이 아니며 무조건적으로 중괄호 초기화만을 사용하는 것도

옳은 방법이 아니다. 기존에 있던 문법들을 무시하며 의도치 않게 다르게 동작할 수도 있으니 사용 시 

주의가 필요하다.