숏컷 코드
cpp
int count{10};
double ratio{0.75};
std::string name{"Mina"};
std::vector<int> scores{90, 85, 100};
std::pair<int, std::string> entry{1, "first"};
struct Point { int x; int y; };
Point p{3, 4};문법
왜 중괄호 초기화인가 — 통일과 안전
C++11 이전에는 초기화 문법이 상황마다 달랐습니다: int x = 0;, Point p(3, 4);, int arr[] = {1,2};. 중괄호 초기화 {}는 이 모든 경우에 동일한 문법을 제공합니다. 추가로 좁히기 변환을 컴파일 오류로 차단하는 안전 장치가 생깁니다.
cpp
int a(3.7); // 컴파일 — 3으로 잘림 (소리 없이)
int b = 3.7; // 컴파일 — 3으로 잘림
int c{3.7}; // ❌ 컴파일 오류 — 좁히기 변환 거부
// 의도한 변환이라면 캐스트 명시
int d{static_cast<int>(3.7)}; // ✅ 명시적 변환값 초기화 — 기본값 보장
T{}처럼 중괄호를 비워두면 타입의 기본값으로 초기화됩니다. 정수는 0, 포인터는 nullptr, 객체는 기본 생성자 호출.
cpp
int n{}; // 0
double d{}; // 0.0
int* p{}; // nullptr
std::vector<int> v(5); // {0, 0, 0, 0, 0} — 5개 원소
std::vector<int> v2{5}; // {5} — 원소 1개! (initializer_list 우선)initializer_list 생성자와의 우선순위
{}를 쓰면 컴파일러는 initializer_list 생성자를 우선합니다. vector<int>{5}는 크기 5짜리 벡터가 아니라 원소 {5} 하나짜리 벡터입니다.
cpp
std::vector<int> a(5); // 5개 원소 (값 0) — () 사용
std::vector<int> b{5}; // 원소 1개: [5] — initializer_list
std::vector<int> c(3, 1); // 3개 원소 (값 1): [1, 1, 1]
std::vector<int> d{3, 1}; // 2개 원소: [3, 1]이 규칙 때문에 vector 크기 지정에는 ()를, 원소 목록에는 {}를 쓰는 것이 관례입니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 좁히기 변환 방지 | T{value} |
| 기본값(0/null)으로 초기화 | T{} |
| 원소 목록으로 컨테이너 초기화 | Container{a, b, c} |
| 특정 크기의 vector | vector<int>(n) — () 사용 |
| 특정 크기 + 초기값 | vector<int>(n, val) — () 사용 |
주의할 점
vector에 {n}을 쓰면 크기 n이 아니라 원소 1개짜리 {n} 벡터가 됩니다. 크기 지정에는 반드시 (n)을 씁니다.
cpp
// ❌ 의도: 5개 원소 vector
std::vector<int> v{5}; // 실제: {5} — 원소 1개짜리
// ✅ 크기 지정은 ()
std::vector<int> v2(5); // 5개 원소 (모두 0)
// ❌ 의도: 3개 원소, 모두 1
std::vector<int> v3{3, 1}; // 실제: {3, 1} — 원소 2개
// ✅ 크기 + 초기값은 ()
std::vector<int> v4(3, 1); // {1, 1, 1}참고 링크
1 sources