Rumah > pembangunan bahagian belakang > C++ > Mengapa Pembina Salinan Tidak Dipanggil Semasa Permulaan Terus dalam C ?

Mengapa Pembina Salinan Tidak Dipanggil Semasa Permulaan Terus dalam C ?

Patricia Arquette
Lepaskan: 2024-12-16 17:01:09
asal
689 orang telah melayarinya

Why Isn't the Copy Constructor Called During Direct Initialization in C  ?

Pembina Salin Dipanggil oleh Permulaan Terus

Dalam coretan kod yang disediakan, anda mungkin menjangkakan pembina salinan akan digunakan apabila memberikan A(5 ) kepada a. Walau bagaimanapun, kod itu tidak pernah memanggil pembina salinan. Tingkah laku ini bukan hasil daripada pengoptimuman pengkompil tetapi sebaliknya ciri yang didokumenkan bagi C .

Apabila anda memulakan objek menggunakan pemulaan langsung (A a = A(5);), pengkompil melakukan penyingkiran salinan. Pengoptimuman ini mengalih keluar pembinaan yang tidak perlu bagi objek sementara diikuti dengan salinan objek itu kepada pembolehubah yang dimulakan. Sebaliknya, pembolehubah yang dimulakan dimulakan terus dengan hujah kepada pembina.

Tingkah laku ini didokumenkan dalam piawai C (§12.8.15, ms. 211), yang menyatakan bahawa pemulaan langsung adalah bersamaan dengan membina objek di tempat menggunakan argumen kepada pembina:

T x; // Default initialization
T x = y; // Direct initialization
Salin selepas log masuk

Dalam kes ini, a dimulakan secara langsung dengan hujah kepada pembina A, memintas pembina salinan. Untuk memaksa pengkompil memanggil pembina salinan, anda perlu membina lalai yang pertama:

A a;
// A is now a fully constructed object,
// so it can't call constructors again:
a = A(5);
Salin selepas log masuk

Ini memastikan bahawa pembina salinan dipanggil apabila a diberikan nilai A(5).

Atas ialah kandungan terperinci Mengapa Pembina Salinan Tidak Dipanggil Semasa Permulaan Terus dalam C ?. 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