>백엔드 개발 >C++ >C 20에서 기본 클래스 멤버를 초기화하는 데 지정된 초기화 프로그램을 사용할 수 있습니까?

C 20에서 기본 클래스 멤버를 초기화하는 데 지정된 초기화 프로그램을 사용할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-29 19:06:30687검색

 Can Designated Initializers be Used to Initialize Base Class Members in C  20?

C 20의 지정 이니셜라이저: 제한 사항 설명

C 20에 도입된 지정 이니셜라이저를 사용하면 집계에 대한 멤버 초기화 순서를 명시적으로 지정할 수 있습니다. . 그러나 파생 클래스에 대한 사용과 관련하여 최근 질문이 제기되었습니다.

제공된 코드 예제에서:

<code class="cpp">struct Person
{
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person
{
    unsigned salary{DEFAULT_SALARY};
};

int main()
{
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile
    Employee e2 {.salary{55000}}; // warning: missing initializer for base class member
}</code>

지정된 초기화는 초기화에만 사용할 수 있으므로 코드는 e1을 컴파일하지 못합니다. 파생 클래스의 비정적 멤버를 직접 사용합니다. 즉, 지정된 초기화 프로그램을 사용하여 기본 클래스의 멤버를 직접 초기화할 수 없습니다.

이 문제를 해결하려면 다음 접근 방식을 사용할 수 있습니다.

  • 기존 목록 초기화:

    <code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>
  • 중첩된 지정 초기화 목록:

    <code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>

또는 @Jarod42가 제안한 대로 초기화 목록을 지정할 수도 있습니다. 기본 클래스의 경우 명시적으로:

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, .salary{50000} };</code>

이를 사용하면 지정된 초기화 프로그램을 사용하여 직접 기본 클래스 멤버와 파생 클래스 멤버를 모두 초기화할 수 있습니다.

위 내용은 C 20에서 기본 클래스 멤버를 초기화하는 데 지정된 초기화 프로그램을 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.