지정 이니셜라이저 : designated initializers
개요
C++20부터 구조체와 배열 등에 지정 이니셜라이저를 사용하여 멤버 이름을 명시적으로 지정해 초기화할 수 있습니다.
이를 통해 멤버 순서와 관계없이 원하는 멤버만 선택적으로 초기화할 수 있으며, 지정하지 않은 멤버는 기본값으로 초기화됩니다.
C++ 버전별 주요 키워드 도입 시기
- C++20: P1008R1 제안에 따라 지정 이니셜라이저 도입
내용 설명
- 구조체, 배열, 클래스 애그리게이트에 사용 가능
.멤버 = 값
형식으로 초기화하며, 초기화 순서와 정의 순서는 무관- 지정하지 않은 멤버는 기본값(0 또는 디폴트 생성자)으로 초기화
- 동일 멤버를 중복 지정 시 컴파일 에러 발생
예제 코드
#include <cstdint>
#include <iostream>
struct User {
enum class Status { Connected, Disconnected } status;
std::uint64_t id;
};
int main() {
User user = {.status = User::Status::Connected, .id = 42U};
std::cout << "user.status = " << static_cast<int>(user.status) << "\n";
std::cout << "user.id = " << user.id << "\n";
/* C++에서는 아직 안된다.
// C 스타일 지정 초기화 (GCC/Clang 확장, C++23 표준에도 일부 지원)
int arr[8] = { [2] = 100, // 인덱스 2에 100 설정
[5] = 200 }; // 인덱스 5에 200 설정
// 나머지 요소는 0으로 초기화됨
*/
int arr[8] = { 0, 0, 100 };
// arr[0]=0, arr[1]=0, arr[2]=100,
// 나머지 요소는 자동으로 0
std::cout << "arr = {";
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << (i + 1 < 5 ? ", " : "");
}
std::cout << "}\n";
return 0;
}
실행 결과
user.status = 0
user.id = 42
arr = {0, 0, 10, 0, 20}
활용팁
- 구조체 초기화 시 실수로 순서를 섞는 실수를 방지할 수 있습니다.
- 배열에서 특정 인덱스만 초기화할 때 유용하며, 대규모 초기화 코드의 가독성을 높입니다.
- 기본 생성자나 디폴트 멤버 초기화를 이용한 복잡한 애그리게이트 초기화에도 활용 가능합니다.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ : enum concepts (11, 20) (1) | 2025.08.03 |
---|---|
Modern C++ : enum vs enum class (98, 11) (1) | 2025.08.02 |
Modern C++ 둘러보기 (3) | 2025.08.01 |