Disyorkan, 2024

Pilihan Editor

Perbezaan antara Operator Pembina Salin dan Penyerah Hak dalam C ++

Salinan pembina dan pengendali tugasan, adalah dua cara untuk memulakan satu objek menggunakan objek lain. Perbezaan asas antara pembekal salinan dan pengendali tugasan adalah bahawa pembangun salinan memperuntukkan memori berasingan kepada kedua-dua objek, iaitu objek sasaran yang baru dibuat dan objek sumber. Operator tugasan memperuntukkan lokasi memori yang sama dengan objek sasaran yang baru dicipta serta objek sumber.

Marilah kita mengkaji perbezaan antara pengendali salinan dan pengendali tugasan.

Carta Perbandingan

Asas untuk PerbandinganSalinan PembinaPengendali Tugasan
AsasPembina salinan adalah pembina yang dibebankan.Pengendali tugasan adalah operator bitwise.
MaknaPembuat salinan menyusun objek baru dengan objek yang sudah ada.Operator tugasan menyerahkan nilai satu objek ke objek lain yang kedua-duanya sudah wujud.
Sintaksclass_name (cont class_name & object_name) {
// badan pembina
}
class_name Ob1, Ob2;
Ob2 = Ob1;
Menyalahgunakan(1) Copy konstruktor memanggil apabila objek baru dimulakan dengan yang sedia ada.
(2) Objek diluluskan kepada fungsi sebagai parameter bukan rujukan.
(3) Objek dikembalikan dari fungsi.
Pengendali tugasan hanya digunakan apabila menyerahkan objek sedia ada objek baru.
Alokasi MemoriKedua-dua objek sasaran dan objek permulaan berkongsi lokasi memori yang berbeza.Kedua-dua sasaran objek dan objek permulaan saham sama diperuntukkan ingatan.
LalaiJika anda tidak menentukan apa-apa pembina salinan dalam program ini, pengkompil C ++ secara tersirat menyediakan satu.Sekiranya anda tidak membebani pengendali "=", maka salinan bitwise akan dibuat.

Takrif Salinan Pembina

"Pembuat salinan" adalah satu bentuk pembina yang dibebankan . Pembuat salinan hanya dipanggil atau dipanggil untuk tujuan permulaan. Pembina salinan menyusun objek yang baru diwujudkan oleh objek lain yang sedia ada. Apabila pembina salinan digunakan untuk memulakan objek sasaran yang baru dibuat, maka kedua objek sasaran dan objek sumber berkongsi lokasi memori yang berbeza. Perubahan yang dilakukan pada objek sumber tidak mencerminkan objek sasaran. Bentuk umum penyalin salinan adalah

 class_ name (class_name & object_name) {. // badan penyalin salinan. } // object_name merujuk kepada objek di sebelah kanan pemulaan. 

Jika programmer tidak membuat pembangun salinan dalam program C ++, maka pengkompil secara tersirat menyediakan pembina salinan. Pembina salinan tersirat yang disediakan oleh pengkompil melakukan salinan sumber ahli dari objek sumber. Tetapi, kadang-kadang salinan ahli-ahli tidak mencukupi, kerana objek itu mungkin mengandungi pembolehubah penunjuk. Menyalin cara pembolehubah penunjuk, kami menyalin alamat yang disimpan dalam pembolehubah penunjuk, tetapi kami tidak mahu menyalin alamat yang disimpan dalam pembolehubah penunjuk, sebaliknya kami ingin menyalin pointer pointer apa. Oleh itu, terdapat keperluan 'pembekal salinan' yang jelas dalam program ini untuk menyelesaikan masalah seperti ini.

Pembina salinan dilibatkan dalam tiga syarat seperti berikut:

  • Copy konstruktor memanggil apabila objek baru diisytiharkan dengan yang sedia ada.
  • Objek diluluskan kepada fungsi sebagai parameter tak rujukan.
  • Objek dikembalikan dari fungsi.

Marilah kita memahami pembina salinan dengan contoh.

 salinan kelas {int num; awam: salinan () {} // salinan pembina lalai (int a) {// memulakan pembina num = a; } salin (salinan & c) {// Copy constructor num = c.num; } menunjukkan kekosongan () {cout << num; }}; int main () {copy A (200); // Objek A dicipta dan disalin salinan B (A); // Salinan pembina yang dipanggil salinan C = A; // Salinan pembina yang dipanggil salinan D; D = A; // penyalin salinan tidak dipanggil kerana objek D bukan objek yang baru diciptakan. // Ini adalah operasi tugasan. kembali 0; } 

Dalam kod di atas, saya telah menyatakan secara eksplisit pembina "salinan (salinan & c)". Pembuat salinan ini dipanggil apabila objek B diinisialisasi menggunakan objek A. Kali kedua dipanggil apabila objek C sedang diinisikan menggunakan objek A. Apabila objek D diinisialisasi menggunakan objek A, pembina salinan tidak dipanggil kerana ketika D sedang diinisialisasi ia sudah wujud, bukan yang baru dicipta. Oleh itu, di sini pengendali tugasan digunakan.

Definisi Pengendali Tugasan

Pengendali tugasan adalah operator penugasan C ++. Pengendali "=" digunakan untuk memanggil pengendali tugasan. Ia menyalin data dalam satu objek secara identik dengan objek lain. Pengendali tugasan menyalin satu objek kepada ahli lain-bijak. Jika anda tidak membebani pengendali tugasan, ia melakukan salinan bitwise. Oleh itu, anda perlu membebani pengendali tugasan.

 salinan kelas {int num; awam: salinan () {} // salinan pembina lalai (int a) {// memulakan pembina num = a; } menunjukkan kekosongan () {cout << num; }}; int main () {copy A (200); // Objek A dicipta dan disalin salinan B (300); // Objek B dicipta dan dimulakan B = A; // operator tugasan yang dipanggil salinan C; C = A; / // pengendali tugasan memanggil pulangan 0; } 

Dalam kod di atas apabila objekA ditugaskan untuk objek B pengendali tugasan sedang digunakan kerana kedua-dua objek tersebut sudah ada. Begitu juga, sama seperti ketika objek C diasaskan dengan objek A.

Apabila tugasan bitwise dilakukan kedua-dua objek itu berkongsi lokasi memori yang sama dan perubahan dalam satu objek mencerminkan objek lain.

Perbezaan Kekunci Antara Penyusun Salin dan Penugasan Penyerahan

  1. Pembina salinan adalah kontruktur yang dibebankan dimana sebagai pengendali tugasan adalah operator bitwise.
  2. Menggunakan pembina salinan anda boleh memulakan objek baru dengan objek yang sudah ada. Di sisi lain, pengendali tugasan menyalin satu objek ke objek lain, yang keduanya sudah ada.
  3. Penyusun salinan diinisikan setiap kali objek baru diisytiharkan dengan objek yang sudah sedia ada, apabila objek diluluskan kepada fungsi sebagai parameter bukan refrence, atau apabila objek dikembalikan dari fungsi. Sebaliknya, pengendali tugasan hanya digunakan apabila objek ditugaskan ke objek lain.
  4. Apabila objek sedang dimulakan menggunakan pembina salinan, objek permulaan dan objek yang diisytiharkan berkongsi lokasi memori yang berbeza. Sebaliknya, apabila objek sedang dimulakan menggunakan pengendali tugasan maka objek permulaan dan permulaan mengongsi lokasi ingatan yang sama.
  5. Jika anda tidak mendefinisikan secara jelas penyusun salinan maka pengkompil menyediakan satu. Sebaliknya, jika anda tidak membebani pengendali assigment maka operasi salinan bitwise dilakukan.

Kesimpulan:

Pembina Salin adalah yang terbaik untuk menyalin satu objek kepada yang lain apabila objek tersebut mengandungi petunjuk mentah.

Top