Rumah >pembangunan bahagian belakang >C++ >Mengapakah Pembina Lalai Persendirian Menghalang Penciptaan Objek dalam C Tetapi Permulaan Berdiri Berfungsi?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-12 20:39:02814semak imbas

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
}

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:

  • 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!

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