본문 바로가기

프로그래밍/C++

[C++11] 균일 초기화(중괄호 초기화)

중괄호 초기화

 

 Visual Studio 2010, 또는 그 이하의 버전에서 구조체를 초기화하려면 별도의 초기화 함수를 두거나, 클래스처럼 초기화를 만들어야 했다. 예를 들어, Windows API 에서 자주 쓰이는 구조체 RECT를 보자.

 

VS 2010 까지는 RECT 초기화를 이렇게 해줘야 했다.

 

RECT rc;

rc.left = 0; rc.top = 0, rc.right = 100; rc.bottom = 100;

 

조금 귀찮아지면 이렇게 만들어 있다.

RECT MakeRect(LONG left, LONG top, LONG right, LONG bottom)

{

RECT rc;

rc.left = left; rc.top = top, rc.right = right; rc.bottom = bottom;

return rc;

}

 

 

RECT rc = MakeRect(0, 0, 100, 100);

 

, 필요하다면 만들어 줄 수 있지만, 조금 규모가 커진다면 이런 구조체를 여러 개 만들어야 할 것이다. 그 때마다 초기화 함수를 다 구현해야 하나?

 

C++11에서 추가되고 Visual Studio 2013 부터 사용이 가능해진 중괄호 초기화는 이런 문제를 간단하게 해결해준다.

 

중괄호 초기화는 대입 연산자( = ) 대신 사용할 수 있는 초기화 연산자로 {}, 중괄호를 제공한다. 그리고 이 때 중괄호 내에 선언된 인자들을 순서대로 입력하면 각 인자에 해당 값으로 초기화를 해준다.

 

그러니까 이렇게.

RECT rc{0, 0, 100, 100};

 

어떤 추가적인 코드 작성 없이 RECT 라는 구조체가 있으면 사용이 가능하다.

 

중괄호 초기화는 임시 객체를 만들 때 매우 유용한데, 이런 경우에도 사용이 가능하다.

RECT rc;

rc = RECT{0, 0, 100, 100};

 


  

하나 더 예를 들자.

 

struct T{

int i;

string v;

bool b;

};

 

라는 구조체를 만들 경우, 이 구조체는 다음처럼 초기화할 수 있다.

 

T t{1, "hello", false};


, 이렇게 사용하기 위해서는 선언된 순서를 알고, 모든 인자의 값을 다 적어줘야 한다.

 

클래스의 경우, 클래스의 생성자 인수를 (), 소괄호에 넣는 대신 {}, 중괄호에 넣어 초기화할 수 있다. 이제부터는 함수 호출과 헷갈리지 않는 초기화가 가능하다.

 

+ 추가로, 중괄호 초기화는 축소 변환(narrowing conversion)을 지원하지 않는다.

 

예를 들어,

double d{0.5f);

int i{d};

같이 데이터가 잘리는 변환을 지원하지 않는다.

int i{ static_cast<int>(d) };

 같은 명시적인 형변환이 필요하다.

 

+ MSDN에 더없이 완벽한 설명이 돼 있기 때문에 소개는 이정도로만 한다.

| MSDN, 균일 초기화 및 생성자 위임 :

 

https://msdn.microsoft.com/ko-kr/library/dn387583.aspx#Anchor_0