Mengapakah Pembina Lalai Persendirian Menghalang Penciptaan Objek dalam C Tetapi Permulaan Berdiri Berfungsi?

Patricia Arquette
Lepaskan: 2024-11-12 20:39:02
asal
719 orang telah melayarinya

Why Does a Private Default Constructor Prevent Object Creation in C   But Braced Initialization Works?

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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:

  • Tidak mempunyai pembina yang disediakan pengguna
  • Tidak mempunyai peribadi atau ahli data bukan statik yang dilindungi
  • Tidak mempunyai kelas asas
  • Tidak mempunyai fungsi maya

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan