Mordern C++ 중괄호 초기화

CJB_ny·2022년 8월 29일
0

C++ 정리

목록 보기
74/95
post-thumbnail

C++11에서 초기화 하는 문법이 더 추가가됨.

그런데 다른 C++11에서의 혁신적인 기능에 비해서 엄청 중요하지는 않음.

중괄호 초기화

int a = 0;
int b(0);


int c {0};
int d = {0};

Knight k3 {k1}; -> 복사 생성자

무슨장점?

() 이거 있는데 {} 왜 쓰냐??

배열같은 경우 '{}'를 사용하여 초기화를 해주었었는데

제각각 따로 (), {} 해주었어야 됬는데

벡터의 경우에도

이런식으로 해주다가

이렇게 '초기화'를 해줄 수 있었는데

벡터10칸짜리에 각기 다른 값으로 초기화를 해주고 싶으면 마땅한 문법이 없었다.

그래서 C++11부터 중괄호 초기화 추가 되면서

이런식으로

vector<int> v3 {1, 2, 3, 4 };

이렇게 사용할 수 있게 되었다. (push_back이랑 똑같음)

장점.

  • vector등 container와 잘 어울린다.

  • 축소 변환 방지.

축소 변환 방지.

이렇게해주면 데이터 타입이 맞지가 않아서 데이터 손실이 일어날 수도있다.

그런데 중괄호 통해서 초기화를 해주면


이렇게 축소 변환이 필요하다고 함.

이렇게 '방지'를 하는 차원에서 도움이 됨.

Bonus ❗❗

이렇경우 이것은 지금 Knight의 기본 생성자를 호출하는게 아니라

Knight를 반환하는 k4라는 이름을 가지는 함수이다.

이런 문법이 좀 햇갈리는데

만약에 새로운 중괄호 버젼으로 호출하면

기본 생성자가 호출이 된다.

중괄호 초기화 단점.

벡터와 마친가지로 무제한으로 생성자로 받아주고 싶다면

Initialize_list를 사용하는 생성자를 만들어준다.

그러면 이제 이렇게 사용이 가능하다.

그러면 여기서 문제가 있는데

인자를 두개를 받는 Knight의 생성자가 있다고 치자.

그러면 이제 아리달쏭한게

이런느낌으로 정수를 두개 넣어 주었을대 어떤 생성자를 호출 할까?

그러면 무조건

얘가 호출이 된다.

다른 생성자를 만들어 주었지만 Initialize_list버젼의 생성자가 최상위 포식자처럼 동작한다.

그냥 호불호

  • 괄호 초기화 ()를 기본으로 간다

    전통적인 C++(거부감이 없음)
    vector등 특이한 케이스에 대해서만 {}사용

  • 중괄호 초기화 {}를 기본으로 간다

    초기화 문법의 일치화
    축소 변환 방지

나는 괄호 초기화 ()사용하자.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글