Pemula Ditetapkan dalam C 20: Permulaan Kelas Terbitan
Pemula yang ditetapkan, diperkenalkan dalam C 20, membenarkan pengamulaan tepat ahli kelas menggunakan senarai-pemula yang ditetapkan. Walau bagaimanapun, soalan baru-baru ini menerangkan tentang tingkah laku yang tidak dijangka dengan kelas terbitan.
Soalan:
Kod berikut menggambarkan isu:
<code class="cpp">struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{10000}; }; int main() { Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Ok Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Doesn't compile Employee e2{.salary{55000}}; // Warning: missing initializer for base class }</code>
Mengapakah pemulaan Pekerja dengan pemula yang ditetapkan gagal dan menghasilkan amaran untuk pemula yang hilang?
Jawapan:
Mengikut Standard C 20 (9.3.1 Agregat, hlm. #3), apabila menggunakan pemula yang ditetapkan, setiap pengecam dalam penentu mesti menamakan ahli data bukan statik langsung bagi kelas. Ini menunjukkan bahawa ahli kelas asas tidak boleh dimulakan menggunakan pemula yang ditetapkan.
Oleh itu, memulakan Pekerja menggunakan pemula yang ditetapkan, seperti dalam kes e1, adalah tidak betul dan harus diganti dengan sama ada pemula senarai atau pemulaan bersarang sebagai berikut:
<code class="cpp">Employee e1{"John", "Wick", 40, 50000}; // List initialization Employee e2{{"John", "Wick", 40}, 50000}; // Nested initialization Employee e1{{.name{"John"}, .surname{"Wick"}, .age{40}}, 50000}; // Nested initialization with designated initializer for base class</code>
Dalam contoh terakhir, kelas asas Orang dimulakan menggunakan senarai pemula yang ditetapkan dalam pemulaan bersarang.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Memulakan Ahli Kelas Terbitan Menggunakan Pemula Ditetapkan dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!