Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Pembina Salinan Lalai Mengendalikan Kelas dengan Objek Tiada Pembina Salinan Diisytiharkan?

Bagaimanakah Pembina Salinan Lalai Mengendalikan Kelas dengan Objek Tiada Pembina Salinan Diisytiharkan?

Barbara Streisand
Barbara Streisandasal
2024-11-12 12:15:02555semak imbas

How Does the Default Copy Constructor Handle Classes with Objects Lacking Declared Copy Constructors?

Pembina Salinan Lalai untuk Kelas yang Mengandungi Objek Lain

Apabila mengisytiharkan kelas dalam C , pengkompil boleh secara automatik menyediakan pembina salinan lalai jika pelaksanaan eksplisit tidak disediakan. Walau bagaimanapun, tingkah laku pembina ini menjadi lebih kompleks apabila berurusan dengan kelas yang mengandungi objek yang tidak mempunyai pembina salinan yang diisytiharkan.

Pertimbangkan kod berikut:

class Foo {
  Bar bar;
};

class Bar {
  int i;
  Baz baz;
};

class Baz {
  int j;
};

Foo f1;
Foo f2(f1);

Persoalannya timbul: apakah adakah pembina salinan lalai akan lakukan dalam senario ini?

Gelagat Pembina Salinan Dijana Pengkompil

Pembina salinan yang dijana pengkompil untuk Foo akan berkelakuan seperti berikut:

  1. Panggil pembina salinan kelas asasnya (jika ada).
  2. Salin setiap pembolehubah ahli Foo. Ini melibatkan memanggil pembina salinan untuk Bar.
  3. Pembina salinan Bar kemudiannya akan memanggil pembina salinan untuk Baz.

Oleh itu, dalam contoh yang disediakan, apabila membina f2 menggunakan f1 , pengkompil akan:

  1. Panggil pembina salinan Foo untuk f2.
  2. Pembina salinan Foo akan memanggil pembina salinan bar.
  3. Salinan pembina bar akan memanggil pembina salinan baz.

Memandangkan Baz tidak mempunyai pembina salinan yang diisytiharkan, pengkompil akan menjana pembina salinan lalai untuknya. Pembina salinan lalai ini akan melakukan salinan cetek, menyalin nilai j tetapi bukan objek yang ditunjukkannya.

Salinan Cetek vs. Dalam

Adalah penting untuk ambil perhatian bahawa tingkah laku salinan cetek ini bermakna bahawa sebarang objek yang ditunjuk oleh pembolehubah ahli Foo tidak akan disalin. Ini boleh mengakibatkan akibat yang tidak diingini jika objek asal diubah suai kemudian, kerana nilai yang diubah suai tidak akan ditunjukkan dalam objek yang disalin.

Untuk kawalan yang lebih mendalam ke atas proses penyalinan, adalah disyorkan untuk mentakrifkan pembina salinan secara eksplisit untuk sebarang kelas yang memerlukan penyalinan terkawal pembolehubah ahlinya.

Atas ialah kandungan terperinci Bagaimanakah Pembina Salinan Lalai Mengendalikan Kelas dengan Objek Tiada Pembina Salinan Diisytiharkan?. 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