Bilakah Pembina Persendirian Bukan Pembina Persendirian?
Dalam C , menjadikan pembina peribadi kelihatan seperti cara yang mudah untuk menghalang penciptaan objek di luar kelas. Walau bagaimanapun, tingkah laku yang tidak dijangka timbul apabila pembina lalai diisytiharkan peribadi.
Pertimbangkan kod berikut:
class C { C() = default; }; int main() { C c; // Error: Private constructor auto c2 = C(); // Error: Private constructor }
Anehnya, kod ini gagal disusun disebabkan oleh pembina lalai peribadi. Walau bagaimanapun, kod berikut:
class C { C() = default; }; int main() { C c{}; // Compiles auto c2 = C{}; // Compiles }
berjaya dikompilasi.
Sebab bagi tingkah laku pelik ini terletak pada piawaian C. Menurut 8.4.2/5 [dcl.fct.def.default], fungsi tidak disediakan oleh pengguna jika ia diingkari secara eksplisit pada pengisytiharan pertamanya. Oleh itu, dalam contoh awal kami, pembina lalai tidak disediakan pengguna.
Kekurangan pembina yang disediakan pengguna ini menjadikan kelas C sebagai agregat mengikut 8.5.1/1 [dcl.init.aggr], yang:
Untuk agregat, sintaks braced-init dianggap sebagai panggilan pembina dan bukan pengisytiharan, itulah sebabnya ia berjaya dalam coretan kod yang terakhir.
Atas ialah kandungan terperinci Mengapakah Pembina Lalai Persendirian Menghalang Penciptaan Objek dalam C Tetapi Permulaan Berdiri Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!