Uniform Initialize
C++11 이전에는 초기화 방법이 일관되지 않았다.
struct CircleStruct {
int x, y;
double radius;
};
class CircleClass {
public:
CircleClass(int x, int y, double radius)
: mX(x), mY(y), mRadius(radius) {}
private:
int mX, mY;
double mRadius;
};위와 같이 원을 정의한 구조체와 클래스가 각각 있을 때,
C++11 이전
C++11 이전에는 아래와 같이 초기화 했다.
CircleStruct structCircle = {10, 10, 2.5}; // 구조체 초기화에서는 {...} 사용
CircleClass classCircle(10, 10, 2.5); // 클래스 초기화는 함수표기법 (...) 사용C++11 이후
C++11 이후부터는 중괄호 {} 를 사용하여 유니폼 초기화를 따르도록 통일됐다.
CircleStruct structCircle1 = {10, 10, 2.5};
CircleClass classCircle1 = {10, 10, 2.5};
// 등호 생략도 가능
CircleStruct structCircle2{10, 10, 2.5};
CircleClass classCircle2{10, 10, 2.5};중괄호 {}를 사용한 초기화는 구조체/클래스 말고도 C++의 모든 대상을 초기화할 수 있다.
int a = 3;
int b(3);
int c = {3};
int d{3};
// 제로 초기화
int e{}; // e == 0Narrowing Conversion (축소 변환) 방지
유니폼 초기화는 Narrowing Conveersion (축소 변환) 을 방지할 수 있다.
void func(int i) { /* codes */ }
int main() {
int x = 3.14;
func(3.14);
}변수 x에 3.14를 대입할 때나 func() 의 인자로 3.14를 전달할 때 값이 3으로 줄어든다.
유니폼 초기화를 사용하면 해당 부분에 에러 메시지를 생성한다.
int main() {
int x = {3.14};
func({3.14});
}유니폼 초기화로 동적 할당 배열 초기화
int* pArr = new int[4]{0, 1, 2, 3};클래스 멤버 배열을 생성자 이니셜라이저 로 초기화
class MyClass {
public:
MyClass() : mArray{0, 1, 2, 3} {}
private:
int mArray[4];
};