[C++] 유니폼 초기화란?
🌈 프로그래밍/C++

[C++] 유니폼 초기화란?

반응형

안녕하세요? 수구리입니다.

 

 

저번 포스팅에서는 C++ 이 객체 지향 언어인데 그 특성에 대해서 알아보았었죠?

 

 

 

2021.08.20 - [C++] - [C++] 객체 지향 언어의 특성에 대하여

 

[C++] 객체 지향 언어의 특성에 대하여

안녕하세요? 수구립니다. 저번 포스팅에서는 C++의 고급기능 소개를 마치면서 auto 키워드에 대해서 알아보았습니다. 2021.08.20 - [C++] - [C++] 타입 추론에 대하여 [C++] 타입 추론에 대하여 안녕하세요

tasddc.tistory.com

 

이번 포스팅에서는 초기화를 하는 방식에 대한 내용인데요

 

 

조금 특이하게 초기화하는 유니폼 초기화 방식에 대해서 알아보려고 합니다.

 

 

유니폼의 단어 뜻은 제복, 복장이라는 뜻이죠?

 

 

제가 이해하기로는 여기서 말하는 유니폼은 C++의 구조체, 배열, 클래스? 를 말하는 것 같네요.

 

 

그래서 이 데이터 구조들을 한번에 초기화하는 방식인 것 같습니다.

 

 

그렇다면 본격적으로 알아보도록 하겠습니다!

 

 

 


 

1.4 유니폼 초기화

  • 예전에는 클래스와 구조체의 초기화 방식이 일정하지 않았었다.

C++11 버전에서의 클래스 초기화 방식과 구조체 초기화 방식

  • 위와 같이 클래스는 (...), 구조체는 {...} 를 사용하였다.
  • 하지만 유니폼 초기화를 따르기로 하여 C++11 이후 {...}로 통일되었다.

 

// 모두 3이란 값으로 초기화
int a = 3;
int b(3);
int c= {3}; // 유니폼 초기화
int b{3}; // 유니폼 초기화
  • 유니폼 초기화를 사용하면 축소 변환(narrowing)을 방지할 수 있다!

 

// 축소 변환 에러
void func(int i) { 
    // do something;
}

int main() {
    int x = {3.14};
    func({3.14});
}
  • 추가로 동적으로 할당되는 배열을 초기화할 때도 적용할 수 있다.

 

int* pArray = new int[4]{0, 1, 2, 3};

// 클래스 맴버 배열을 초기화할 수도 있다.
class myClass{
    public:
        MyClass() : mArray{0, 1, 2, 3} {}
    private:
        int mArray[4];
};
  • 단일 초기화는 std::vector 와 같은 표준 라이브러리 컨테이너에도 적용 가능하며 이는 추후에 소개할 예정

 


1.4.1 직접 리스트 초기화와 복제 리스트 초기화

이니셜 라이저

1. 복제 리스트 초기화 : T obj = {arg1, arg2, arg3, ...};

2. 직접 리스트 초기화 : T obj{arg1, arg2, arg3, ...};

 

  • C++17부터는 auto 타입 추론과 관련하여 복제 리스트와 직접 리스트 초기화가 크게 달라졌다.
  • 주의할 점! auto는 직접 리스트 초기화에 대해 값 하나만 추론한다!

 


// 복제 리스트 초기화
auto a = {11}; 
auto b = {11, 22};

// 직접 리스트 초기화
auto c {11}; // int
auto d {11, 22}; // 원소가 많다는 에러 발생

// 복제 리스트 초기화에서 중괄호 안의 원소는 반드시 타입이 모두 같아야 함.
auto b = {11, 22.33} // error

 

  • 1.5 표준 라이브러리는 생략(나중에 자세히..)

 

 

이상으로 유니폼 초기화에 대해서 알아보았습니다.

 

 

감사합니다.

반응형