Skip to content

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에서는 허용
Clone this wiki locally