Dalam C , apabila kelas tidak mengisytiharkan pembina salinan secara eksplisit, pengkompil boleh menghasilkan pembina salinan tersirat untuk memudahkan pemulaan dan penyalinan objek. Walau bagaimanapun, kelakuan pembina tersirat ini boleh mengelirukan, terutamanya apabila kelas mengandungi objek lain.
Pertimbangkan struktur kelas berikut:
class Foo { Bar bar; }; class Bar { int i; Baz baz; }; class Baz { int j; };
Jika kita mencipta contoh Foo dan cuba untuk memulakan contoh lain dengan menyalin yang pertama:
Foo f1; Foo f2(f1);
Pengkompil akan menghasilkan salinan tersirat berikut pembina:
Foo::Foo(Foo const& copy) : bar(copy.bar) {} Bar::Bar(Bar const& copy) : i(copy.i), baz(copy.baz) {} Baz::Baz(Baz const& copy) : j(copy.j) {}
Pembina ini akan melakukan salinan cetek objek masing-masing, menyalin semua pembolehubah ahli secara rekursif. Oleh itu, pembina salinan lalai dalam Foo memang akan memanggil pembina salinan lalai dalam Bar, yang seterusnya akan memanggil pembina salinan lalai dalam Baz.
Adalah penting untuk ambil perhatian bahawa pembina salinan tersirat ini hanya melakukan salinan cetek. Jika objek ahli mengandungi penunjuk atau struktur data kompleks lain, salinannya mesti dikendalikan secara eksplisit untuk memastikan permulaan dan pengurusan sumber yang betul.
Atas ialah kandungan terperinci Bagaimanakah C mengendalikan pembina salinan untuk kelas yang mengandungi objek lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!