반응형
안녕하세요? 수구리입니다.
저번 포스팅에서는 C++ 이 객체 지향 언어인데 그 특성에 대해서 알아보았었죠?
2021.08.20 - [C++] - [C++] 객체 지향 언어의 특성에 대하여
이번 포스팅에서는 초기화를 하는 방식에 대한 내용인데요
조금 특이하게 초기화하는 유니폼 초기화 방식에 대해서 알아보려고 합니다.
유니폼의 단어 뜻은 제복, 복장이라는 뜻이죠?
제가 이해하기로는 여기서 말하는 유니폼은 C++의 구조체, 배열, 클래스? 를 말하는 것 같네요.
그래서 이 데이터 구조들을 한번에 초기화하는 방식인 것 같습니다.
그렇다면 본격적으로 알아보도록 하겠습니다!
1.4 유니폼 초기화
- 예전에는 클래스와 구조체의 초기화 방식이 일정하지 않았었다.
- 위와 같이 클래스는 (...), 구조체는 {...} 를 사용하였다.
- 하지만 유니폼 초기화를 따르기로 하여 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 표준 라이브러리는 생략(나중에 자세히..)
이상으로 유니폼 초기화에 대해서 알아보았습니다.
감사합니다.
반응형
'🌈 프로그래밍 > C++' 카테고리의 다른 글
[C++] 동적 스트링 Part 1 (2) | 2021.08.24 |
---|---|
[C++] 직원 관리 프로그램 만들기 (2) | 2021.08.23 |
[C++] 객체 지향 언어의 특성에 대하여 (0) | 2021.08.20 |
[C++] 타입 추론에 대하여 (0) | 2021.08.20 |
[C++] 1.2.4 ~ 1.2.5 레퍼런스와 익셉션 (2) | 2021.08.19 |