Saya tidak mengerti perbedaan antara konstruktor tugas dan konstruktor salinan di C ++. Seperti ini:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
Saya ingin tahu bagaimana mengalokasikan memori konstruktor tugas dan menyalin konstruktor?
Jawaban:
Sebuah copy constructor digunakan untuk menginisialisasi sebelumnya diinisiasi objek dari data beberapa objek lain.
Sebagai contoh:
Sebuah operator penugasan digunakan untuk mengganti data dari sebelumnya diinisialisasi objek dengan data beberapa objek lain.
Sebagai contoh:
Anda dapat mengganti konstruksi salinan dengan konstruksi default ditambah tugas, tetapi itu akan kurang efisien.
(Sebagai catatan tambahan: Implementasi saya di atas persis seperti yang diberikan compiler kepada Anda secara gratis, jadi tidak masuk akal untuk mengimplementasikannya secara manual. Jika Anda memiliki salah satu dari keduanya, kemungkinan Anda mengelola beberapa resource secara manual. Dalam hal ini, sesuai The Rule of Three , Anda kemungkinan besar juga akan membutuhkan yang lain plus destruktor.)
sumber
=default;
.= default
mereka di mana ctor default diperlukan: cukup mengimplementasikan tubuh kosong sendiri masih dihitung sebagai ctor yang ditentukan pengguna dan dengan demikian (pada tingkat Standar ) tidak sepele dan mendiskualifikasi tipe dari klasifikasi yang membutuhkan ctor sepele.:)
Maukah Anda mencoba menjelaskan lagi apa yang Anda bicarakan?Perbedaan antara copy constructor dan operator penugasan menyebabkan banyak kebingungan bagi programmer baru, tetapi sebenarnya tidak terlalu sulit. Meringkas:
Contoh untuk operator penugasan:
Contoh untuk copy konstruktor:
sumber
vector <A> v3
dan kemudianv3 = v2
(di manav2
yang sebelumnya dideklarasikan dan mengandung elemenvector<A>
) memanggilA
konstruktor copy eksplisit saya, bukanoperator=
? Saya mengharapkanoperator=
untuk dipanggil alih-alihcopy constructor
karenav3
objek saya telah diumumkan pada saat saya melakukan tugasYang pertama adalah inisialisasi salinan, yang kedua hanya tugas. Tidak ada yang namanya konstruktor tugas.
menggunakan konstruktor salinan yang dihasilkan kompilator.
menggunakan konstruktor default untuk membuat
cc
, lalu * operator penugasan ** (operator =
) pada objek yang sudah ada.IDK yang Anda maksud dengan mengalokasikan memori dalam kasus ini, tetapi jika Anda ingin melihat apa yang terjadi, Anda dapat:
Saya juga menyarankan Anda untuk melihat:
Mengapa konstruktor salinan disebut sebagai ganti konstruktor konversi?
Apa The Rule of Three?
sumber
Dengan kata sederhana,
Salin konstruktor dipanggil ketika objek baru dibuat dari objek yang sudah ada, sebagai salinan dari objek yang sudah ada. Dan operator penugasan dipanggil ketika objek yang sudah diinisialisasi diberi nilai baru dari objek lain yang sudah ada.
Contoh-
sumber
Apa yang dikatakan @Luchian Grigore Said diimplementasikan seperti ini
KELUARAN
konstruktor default
salin konstruktor
konstruktor default
operator tugas
sumber
perbedaan antara konstruktor salinan dan konstruktor tugas adalah:
<classname> <o1>=<o2>
)<o1>=<o2>
).Dan fungsi dasar di keduanya sama, mereka akan menyalin data dari o2 ke o1 anggota-demi-anggota.
sumber
Saya ingin menambahkan satu hal lagi tentang topik ini. "Fungsi operator dari operator penugasan harus ditulis hanya sebagai fungsi anggota kelas." Kita tidak bisa menjadikannya sebagai fungsi teman tidak seperti operator biner atau unary lainnya.
sumber
Sesuatu untuk ditambahkan tentang konstruktor salinan:
Saat mengirimkan objek berdasarkan nilai, itu akan menggunakan konstruktor salinan
Ketika sebuah objek dikembalikan dari fungsi dengan nilai, itu akan menggunakan konstruktor salinan
Saat menginisialisasi objek menggunakan nilai-nilai objek lain (seperti contoh yang Anda berikan).
sumber