Mari kita pelajari perbedaan antara copy constructor dan operator penugasan.
Grafik perbandingan
Dasar untuk Perbandingan | Salin Pembuat | Operator Penugasan |
---|---|---|
Dasar | Salin konstruktor adalah konstruktor kelebihan beban. | Operator penugasan adalah operator bitwise. |
Berarti | Copy constructor menginisialisasi objek baru dengan objek yang sudah ada. | Operator penugasan memberikan nilai dari satu objek ke objek lain yang keduanya sudah ada. |
Sintaksis | class_name (cont class_name & object_name) { // badan konstruktor } | class_name Ob1, Ob2; Ob2 = Ob1; |
Memohon | (1) Salin konstruktor memanggil ketika objek baru diinisialisasi dengan yang sudah ada. (2) Objek diteruskan ke fungsi sebagai parameter non-referensi. (3) Objek dikembalikan dari fungsi. | Operator penugasan dipanggil hanya ketika menetapkan objek yang ada objek baru. |
Alokasi memori | Objek target dan objek inisialisasi berbagi lokasi memori yang berbeda. | Objek target dan objek inisialisasi berbagi memori yang dialokasikan sama. |
Default | Jika Anda tidak mendefinisikan konstruktor salin dalam program ini, kompiler C ++ secara implisit menyediakannya. | Jika Anda tidak membebani operator "=", maka salinan bitwise akan dibuat. |
Definisi Copy Constructor
“Copy constructor” adalah bentuk dari constructor yang kelebihan beban . Salin konstruktor hanya dipanggil atau dipanggil untuk tujuan inisialisasi. Salin konstruktor menginisialisasi objek yang baru dibuat oleh objek lain yang sudah ada. Ketika copy constructor digunakan untuk menginisialisasi objek target yang baru dibuat, maka objek target dan objek sumber berbagi lokasi memori yang berbeda. Perubahan yang dilakukan pada objek sumber tidak mencerminkan objek target. Bentuk umum dari copy constructor adalah
class_ name (class_name & object_name) {. // badan pembuat salinan. } // object_name merujuk ke objek di sisi kanan inisialisasi.
Jika programmer tidak membuat copy constructor dalam program C ++, maka kompiler secara implisit menyediakan copy constructor. Konstruktor salinan implisit yang disediakan oleh kompiler melakukan salinan anggota-bijaksana dari objek sumber. Tapi, kadang-kadang salinan anggota-bijaksana tidak cukup, karena objek dapat berisi variabel pointer. Menyalin variabel pointer berarti, kami menyalin alamat yang disimpan dalam variabel pointer, tetapi kami tidak ingin menyalin alamat yang disimpan dalam variabel pointer, sebagai gantinya kami ingin menyalin apa yang menunjuk ke pointer. Oleh karena itu, ada kebutuhan 'copy constructor' eksplisit dalam program untuk memecahkan masalah semacam ini.
Salin konstruktor dipanggil dalam tiga kondisi sebagai berikut:
- Salin konstruktor memanggil ketika objek baru diinisialisasi dengan yang sudah ada.
- Objek diteruskan ke fungsi sebagai parameter non-referensi.
- Objek dikembalikan dari fungsi.
Mari kita pahami copy constructor dengan sebuah contoh.
copy kelas {int num; publik: salin () {} // salin konstruktor default (int a) {// inisialisasi konstruktor num = a; } salin (salin & c) {// Salin konstruktor num = c.num; } void show () {cout << num; }}; int main () {copy A (200); // Objek A membuat dan menginisialisasi salinan B (A); // Salin konstruktor yang disebut salin C = A; // Salin konstruktor yang disebut salin D; D = A; // copy constructor tidak dipanggil karena objek D bukan objek yang baru dibuat. // itu adalah operasi penugasan. return 0; }
Dalam kode di atas, saya secara eksplisit mendeklarasikan konstruktor “copy (copy & c)”. Copy constructor ini dipanggil ketika objek B diinisialisasi menggunakan objek A. Kedua kalinya disebut ketika objek C diinisialisasi menggunakan objek A. Ketika objek D diinisialisasi menggunakan objek A konstruktor copy tidak dipanggil karena ketika D sedang diinisialisasi sudah ada, bukan yang baru dibuat. Karenanya, di sini operator penugasan dipanggil.
Definisi Operator Penugasan
Operator penugasan adalah operator yang menugaskan C ++. Operator “=” digunakan untuk memanggil operator yang ditugaskan. Ini menyalin data dalam satu objek identik ke objek lain. Operator penugasan menyalin satu objek ke anggota lainnya. Jika Anda tidak membebani operator penugasan, itu melakukan salinan bitwise. Karena itu, Anda perlu membebani operator penugasan.
copy kelas {int num; publik: salin () {} // salin konstruktor default (int a) {// inisialisasi konstruktor num = a; } void show () {cout << num; }}; int main () {copy A (200); // Objek A membuat dan menginisialisasi salinan B (300); // Objek B dibuat dan diinisialisasi B = A; // operator penugasan meminta salinan C; C = A; // operator penugasan memohon pengembalian 0; }
Dalam kode di atas ketika objectA ditugaskan ke objek B operator penugasan sedang dipanggil karena kedua objek sudah ada. Demikian pula, hal yang sama terjadi ketika objek C diinisialisasi dengan objek A.
Ketika penugasan bitwise dilakukan baik objek berbagi lokasi memori yang sama dan perubahan dalam satu objek mencerminkan di objek lain.
Perbedaan Utama Antara Pembuat Salin dan Operator Penugasan
- Salin konstruktor adalah kontruktor kelebihan beban di mana sebagai operator penugasan adalah operator bitwise.
- Menggunakan copy constructor Anda dapat menginisialisasi objek baru dengan objek yang sudah ada. Di sisi lain, operator penugasan menyalin satu objek ke objek lain, yang keduanya sudah ada.
- Salin konstruktor diinisialisasi setiap kali objek baru diinisialisasi dengan objek yang sudah ada, ketika objek diteruskan ke fungsi sebagai parameter non referensi, atau ketika objek dikembalikan dari fungsi. Di sisi lain, operator penugasan dipanggil hanya ketika suatu objek ditugaskan ke objek lain.
- Ketika suatu objek diinisialisasi menggunakan copy constructor, objek inisialisasi dan objek yang diinisialisasi berbagi lokasi memori yang berbeda. Di sisi lain, ketika sebuah objek sedang diinisialisasi menggunakan operator penugasan maka objek yang diinisialisasi dan inisialisasi berbagi lokasi memori yang sama.
- Jika Anda tidak secara eksplisit mendefinisikan konstruktor salinan maka kompilator menyediakannya. Di sisi lain, jika Anda tidak membebani operator tugas maka operasi penyalinan bitwise dilakukan.
Kesimpulan:
Copy constructor yang terbaik untuk menyalin satu objek ke objek lain ketika objek berisi pointer mentah.