-
Notifications
You must be signed in to change notification settings - Fork 2
2014 06 20 유니폼 초기화, 초기화 리스트
krikit edited this page Nov 26, 2014
·
2 revisions
C++11부터 중괄호를 이용한 유니폼 초기화 방법이 광범위하게 도입되었습니다.
struct MyStruct {
int num;
double val;
};
class MyClass {
public:
MyClass(int num, double val) : _num(num), _val(val) {}
private:
int _num;
double _val;
};
int main(int argc, char** argv) {
MyStruct str_obj1 = {1, 2.2};
MyStruct str_obj2{2, 3.3}; // C++11 유니폼 초기화
MyClass cls_obj1(1, 2.2); // 기존 방법
MyClass cls_obj2 = {2, 3.3}; // C++11 유니폼 초기화
MyClass cls_obj3{3, 4.4}; // C++11 유니폼 초기화
return 0;
}
유니폼 초기화는 암묵적 축소 변환을 허용하지 않습니다.
void foo(int num);
int i = {3.14}; // 컴파일 에러
foo(3.14); // 버그. foo(3)
foo({3.14}); // 컴파일 에러
C++11부터 STL 컨테이너, 동적으로 할당하는 배열 및 생성자의 배열인 멤버의 초기화에 대해서도 유니폼 초기화가 가능합니다.
std::vector<std::string> vec = {"one", "two", "three"};
int* arr = new int[3]{1, 2, 3};
class MyClass {
public:
MyClass() : _arr{1, 2, 3} {}
private:
int _arr[3];
};
C에서는 물론 가변 갯수의 파라미터가 가능하지만 정의하여 사용하기가 쉽지 않습니다. C++11에서는 초기화 리스트라는 새로운 개념이 도입되어 마치 STL 컨테이너처럼 사용할 수 있습니다.
#include <initializer_list>
int get_ints(std::initializer_list<int> ints);
get_ints({1, 2, 3});
get_ints({1, 2, 3, 4, 5});
get_ints({1, 2, 3.3}); // 암묵적 축소 변환은 일어나지 않으므로 에러
기존에는 템플릿 클래스 인자 안에 다시 템플릿 클래스를 사용하려면 >> 연산자와의 모호성으로 인해 컴파일 오류가 발생했습니다. 이젠 걱정 없이 사용하세요.
std::vector<std::vector<int>> int_vec_of_vec; // C++11에서는 허용