Rumah >pembangunan bahagian belakang >C++ >Mengapa saya tidak boleh menggunakan pemula yang ditetapkan untuk memulakan ahli yang diwarisi dalam C 20?

Mengapa saya tidak boleh menggunakan pemula yang ditetapkan untuk memulakan ahli yang diwarisi dalam C 20?

Barbara Streisand
Barbara Streisandasal
2024-10-28 17:13:02552semak imbas

Why can't I use designated initializers to initialize inherited members in C  20?

Pemula Ditetapkan dalam C 20: Memahami Sekatan

Dalam C 20, pemula yang ditetapkan menyediakan cara yang mudah untuk memulakan ahli agregat tertentu. Walau bagaimanapun, pemula ini mempunyai had tertentu.

Pertimbangkan contoh kod yang disediakan:

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

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

int main()
{
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Possible
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Error
    Employee e2{.salary{55000}}; // Warning
}</code>

Seperti yang ditunjukkan dalam kod, kedua-dua Orang dan Pekerja adalah agregat. Walau bagaimanapun, pemulaan agregat Pekerja menggunakan pemula yang ditetapkan (e1) gagal untuk disusun. Mengapa ini?

Jawapannya terletak pada piawaian C 20, khususnya dalam bahagian 9.3.1 Agregat, perkara 3.1:

"Jika senarai pemula ialah senarai-pemula yang ditetapkan, agregat hendaklah daripada jenis kelas, pengecam dalam setiap penentu hendaklah menamakan ahli data bukan statik langsung bagi kelas, dan elemen agregat yang dimulakan secara eksplisit ialah elemen yang merupakan, atau mengandungi, ahli tersebut."

Dalam erti kata lain, pemula yang ditetapkan hanya boleh digunakan untuk memulakan ahli kelas semasa. Mereka tidak boleh digunakan untuk ahli yang diwarisi atau ahli kelas asas. Sekatan ini adalah sebab permulaan e1 adalah tidak sah.

Untuk memulakan e1 dengan betul, seseorang boleh menggunakan sintaks permulaan senarai biasa:

<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 }; // Works</code>

Sebagai alternatif, seseorang boleh menggunakan gabungan yang ditetapkan dan pemula tidak ditetapkan untuk mencapai hasil yang sama:

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

Dalam kes ini, kelas asas langsung (Orang) dimulakan menggunakan senarai pemula yang ditetapkan, manakala keseluruhan kelas Pekerja dimulakan menggunakan bukan ditetapkan senarai pemula.

Secara keseluruhannya, adalah penting untuk mengingati had pemula yang ditetapkan apabila bekerja dengan hierarki kelas dalam C 20. Dengan menggunakan sintaks permulaan yang sesuai, seseorang boleh memulakan ahli data dengan berkesan dan tepat bagi kedua-dua kelas asas dan terbitan .

Atas ialah kandungan terperinci Mengapa saya tidak boleh menggunakan pemula yang ditetapkan untuk memulakan ahli yang diwarisi dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn