본문 바로가기
C++20/Language

[C++20 - Language] Chapter 02. Designated Initialization (지정 초기화)

by song.ift 2023. 7. 28.

GitHub : https://github.com/developeSHG/CPP20-Language/commit/d3b68fe794104dd00e3242e26efde06e206fb046

 

Designated Initialization (지정 초기화) · developeSHG/CPP20-Language@d3b68fe

developeSHG committed Jul 27, 2023

github.com

 

 


 

 

cpp
닫기
#include <iostream> using namespace std; #include <list> #include <vector> #include <map> #include <algorithm> #include <ranges> #include <concepts> #include <coroutine> // 오늘의 주제 : Designated Initialization (지정 초기화) struct Pos2D { int x; int y; }; class Pos3D { public: // Pos3D() {} // Pos3D(int x, int y, int z) : x(x), y(y), z(z) { } int x; int y; int z; }; int main() { // 지정초기화를 알기 전에, 미리 알아야할 것 // Aggregate Initialization 문법이 있다. (진작에 추가된 것임) // 구조체나 클래스를 사용할 때, 일반적으로 아래처럼 초기화한다. ‌Pos3D pos; ‌pos.x = 0; ‌pos.y = 1; ‌pos.y = 2; // 하지만, 멤버를 매번 할당하는 게 지저분하다. // 그래서 생성자를 만들어서 대입할 수 있지만, 생성자를 만드는 순간, 기본 생성자가 막히기 때문에 기본 생성자도 정의해야한다. // Aggregate Initialization 문법은 아래처럼 맡바로 초기화를 할 수 있다. (순서대로) // 하지만 조건이 있다 // - 직접 만든 생성자가 없어야 한다. // - 가상 함수가 없어야 한다. // - private / protected / static인 데이터 변수 X ‌Pos3D pos{ 1, 2, 3 }; // 그럼에도 위 방법이 마음에 안드는 경우는 변수가 세 가지 밖에 없지만, // 인자가 많아진다고 가정하면, 일일이 초기화하는 경우도 매우 피곤하다. // 또 y, z만 초기값을 정해주고 싶다고 하면 {0, 3, 5} 식으로 x도 임의로 초기값을 정해줄 수 밖에 없다. // 근데 새롭게 추가된 문법에는 이렇게 사용할 수 있다. // 모든 멤버 변수를 다 채울 필요없이 원하는 변수만 초기화가 가능하다는 장점이 있다. ‌Pos3D pos{ .y = 3, .z = 5 }; // 정리하면, 지정해서 초기화할 수 있는 문법이 C++20에 추가된 것. // 하지만 주의할 것은 지정해서 초기화할 수 있다곤 했지만, // 순서를 마음대로 뒤집어서 초기화는 불가능하다. (클래스 멤버 선언 순서대로) ‌Pos3D pos{ .z = 3, .y = 5 }; // 컴파일 에러 // Tip // Aggregate Initialization 문법은 변수 타입과 다른 값을 넣을 경우, 축소 변환이 일어나서 에러없이 사용 가능하다. ‌Pos3D pos{ 1, 2, 3.f }; // 축소 변환 (narrowing conversion) // 하지만 지정초기화 경우는 다른 타입에 대해 축소 변환이 일어나지 않아 컴파일 에러가 발생한다. ‌Pos3D pos{ .x = 1, .y = 2, .z = 3.f }; // 컴파일 에러 }

 

댓글