C++ 초기화 규칙¶
단일 값의 =를 기본으로 하되 생성자 선택·축소 변환을 구분한다. 읽기 전용 여부는 const, 줄 배치는 포맷을 따른다.
핵심 규칙¶
| 상황 | 기본 표기 | 강도 |
|---|---|---|
| 타입이 일치하는 단일 값 | int count = 0; |
권장 |
| 타입이 명확한 함수 결과를 auto로 받는 경우 | auto result = Calculate(); |
권장 |
| 컨테이너의 원소 목록 | std::vector<int> values = {1, 2, 3}; |
권장 |
| 개수 생성자가 있는 컨테이너의 크기·반복값 지정 | std::vector<int> values(3, 10); |
필수 |
| 집합 초기화·빈 값 초기화 | Position position{0.0f, 0.0f};, Position origin{}; |
권장 |
| 공통 멤버 기본값 | int mFrameIndex = 0; |
권장 |
| 생성자 인자에 따라 달라지는 멤버 | 생성자 초기화 목록 | 필수 |
auto 행은 초기화 표기만 정한다. 사용 여부는 auto 규칙을 따른다.
선언할 때 유효한 상태를 만든다¶
필수: 지역 스칼라와 포인터를 미초기화 상태로 두지 않는다. 실제 초기값을 구할 수 있는 위치에서 선언하고, 의미 없는 임시값을 넣은 뒤 곧바로 덮어쓰는 패턴을 피한다.
유효한 기본 생성자는 사용 가능하며 모든 객체를 0·원시 메모리 초기화로 처리하지 않는다.
원소 목록과 생성자 인자를 구분한다¶
#include <vector>
std::vector<int> values = {3, 10}; // 원소 3과 10: 총 2개
std::vector<int> repeatedValues(3, 10); // 값 10인 원소: 총 3개
std::vector<int> zeroValues(3); // 값 0인 원소: 총 3개
필수: ()와 {}를 단순한 포맷 변경으로 치환하지 않는다. 원소 목록을 받는 생성자가 있는 타입은 의미가 달라질 수 있다.
권장: 집합 초기화·explicit 생성자 직접 호출에는 T value{args};를 사용한다. 크기 생성자가 목적이면 ()를 쓰며 explicit만으로 {}를 필수화하지 않는다.
struct Position
{
float x;
float y;
};
Position position{1.0f, 2.0f};
Position origin{}; // 이 구조체의 두 float 멤버는 0으로 초기화된다.
축소 변환을 숨기지 않는다¶
필수: 초기화 과정에서 값의 범위나 정밀도를 잃는 암시적 변환을 피한다. 원본 타입을 유지하거나, 변환 대상 타입에 값이 들어가는지 확인한다. 축소 변환을 금지하려는 초기화에는 {}를 사용하여 언어 규칙에 따른 컴파일 시점 진단을 받는다.
{}는 실행 중 값의 범위를 검사하지 않는다. 실제 값이 대상 타입에 들어가더라도 언어에서 축소 변환으로 분류하면 거부하며, 초기화 표현식 안의 산술 오버플로도 방지하지 않는다.
double distance = 3.5;
double copiedDistance = distance; // 타입 유지
// 아래는 피해야 할 예시이며 주석을 해제하면 마지막 줄은 컴파일 오류다.
// int truncatedDistance = distance; // 문법상 가능하지만 소수부 손실
// int rejectedDistance{distance}; // 축소 변환으로 컴파일 오류
의도적 변환도 범위·반올림·절삭 정책을 정한다. 오류 제거용 캐스트를 피하고 경고를 {}의 축소 변환 진단 대체로 삼지 않는다.
범위·산술·캐스팅의 추가 제안은 변환 초안에 두며 채택 범위에 포함하지 않는다.
멤버의 기본값과 생성자 입력을 구분한다¶
공통 기본값은 멤버 선언에 작성한다. 생성자 입력이 필요한 멤버는 초기화 목록에 작성하고, 목록 순서는 멤버 선언 순서에 맞춘다.
class Player
{
public:
explicit Player(int playerId)
: mPlayerId{playerId}
{
}
private:
int mPlayerId;
int mHealth = 100;
};
본문 대입으로 초기화를 대신하지 않는다. 유효한 초기화 뒤의 상태 갱신은 허용하며 생성자마다 전체 멤버의 유효 상태를 확인한다. 실제 초기화 순서는 멤버 선언 순서다.
적용 범위와 예외¶
auto로 단일 결과를 받을 때는auto value = expression;을 사용한다.auto value = {1};은 정수 하나가 아닌 초기화 목록을 추론하므로 대체 표기로 사용하지 않는다.- 외부 API의 출력 인자를 새로 선언할 때도 먼저 유효한 기본 상태를 만들고, 성공 여부를 확인한 뒤 결과를 사용한다. 이미 유효한 객체나 버퍼를 호출마다 초기값으로 되돌리라는 뜻은 아니다.
- 성능 때문에 버퍼 초기화를 생략하려면 측정 근거와 모든 읽기 전 쓰기가 보장되는 경로를 프로젝트별 예외로 문서화한다.
- 동적 자원 생성, 전역 초기화 순서, 상수의 헤더 정의 방식은 별도 주제로 다룬다.
관련 문서¶
근거와 출처¶
기존 컨벤션(로컬 참고 자료)의 =·원소 목록을 유지하고 explicit의 괄호 선택을 구체화했다. 경고만으로 축소 변환 방지를 보장하지 않아 변환 검토·중괄호 진단을 병행한다.
Core Guidelines의 초기화·멤버 기본값을 참고하되 {} 우선과 달리 같은 타입의 단일 값은 개인 스타일인 =를 유지한다.
출처 확인일: 2026-09-08.
기술 설명 보완 확인일: 2026-09-12. C++ 작업 초안의 목록 초기화와 기반 클래스·멤버 초기화를 확인했다.
채택일: 2026-09-12. 명시된 적용 범위 안에서 채택하며, 후속 정리 대상은 제외한다.
변경 기록¶
-
2026-10-16: 반복 설명·중복 예시·배경을 줄여 핵심 규칙과 예시 중심으로 정리했다. 규칙 강도·예외·버전과 채택·초안·미결정 상태는 유지했다.
-
2026-10-15: auto 예제의 초기화 표기와 사용 여부를 구분하고 채택된 auto 사용 규칙을 연결했다.
-
2026-10-06: 자료형 선택·변환 초안의 관련 링크를 추가하고, 통합 초안의 분리에 맞춰 타입 변환과 범위 검사 문서로 연결했다. 기존 축소 변환 규칙과 채택 상태는 유지했다.