본문 바로가기

[C++11] 중괄호 초기화 리스트 (initializer list)

중괄호를 이용해 다양한 타입의 객체를 초기화할 수 있다.

 

int x {10};  // x를 10으로 초기화

std::string str {"Hello"};  // std::string 객체를 "Hello"로 초기화

int arr[] {1, 2, 3, 4, 5};  // 배열을 1, 2, 3, 4, 5로 초기화
struct Point {
    int x;
    int y;
};
Point p {5, 10};  // Point 구조체 변수 p를 초기화
class MyClass {
public:
    MyClass(int value) : data(value) {} // 멤버 변수 초기화 리스트로 초기화
private:
    int data;
};

int main() {
    MyClass obj1(10);  // 소괄호 사용, 직접 초기화
    MyClass obj2 = MyClass(20);  // 소괄호 사용, 복사 생성자를 호출하는 직접 초기화
    MyClass obj1{10};  // 중괄호 사용, 초기화 리스트를 사용한 초기화
    MyClass obj2 = MyClass{20};  // 중괄호 사용, 복사 생성자를 호출하는 초기화 리스트 사용
    return 0;
}

 

 

초기화 리스트 장점

데이터 손실 형변환(narrowing conversions)을 허용하지 않음

int i = 10.5;  // 허용됨: double에서 int로 변환, 소수점 이하 버림
int j = {10.5};  // 컴파일 오류: double에서 int로의 변환은 소수점 이하 버림이므로 허용되지 않음

 

 

주의사항

1. 경우에 따라 의미가 헷갈릴 수 있다.

std::vector<int> v(10); // 소괄호 사용, vector 요소 10개 생성

std::vector<int> v{10}; // 중괄호 사용, vector 요소 1개이고, 그 요소의 값이 10

 

2. 클래스에서 멤버 변수를 초기화 리스트로 초기화 할 때, 선언 순서와 동일한 순서로 나열해야 한다.

class Example {
public:
    Example() : m_var1(0), m_var2(1) {}
private:
    int m_var2;
    int m_var1;
};

 

순서가 맞지 않으면 다음과 같은 경고가 발생한다.

warning: ‘[클래스명::변수명]’ will be initialized after

'C&C++' 카테고리의 다른 글

[C++11] constexpr  (0) 2024.06.23
[C++11] nullptr  (0) 2024.06.23
[C++11] std::array  (0) 2024.06.23
[C++11] 범위 기반 for (range-based for loop)  (0) 2024.06.23
[C++11] auto  (0) 2024.06.23