중괄호를 이용해 다양한 타입의 객체를 초기화할 수 있다.
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 |