Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bilakah Pembina Salinan Ditakrifkan Pengguna Penting dalam C?

Bilakah Pembina Salinan Ditakrifkan Pengguna Penting dalam C?

Susan Sarandon
Susan Sarandonasal
2024-10-23 18:26:07144semak imbas

When Is a User-Defined Copy Constructor Essential in C  ?

Bilakah Pembina Salinan Ditakrifkan Pengguna Diperlukan?

Pembina salin adalah penting kepada pengaturcaraan berorientasikan objek C, menyediakan cara untuk memulakan objek berdasarkan kejadian sedia ada. Walaupun pengkompil biasanya menjana pembina salinan lalai untuk kelas, terdapat senario di mana penyesuaian diperlukan.

Senario Memerlukan Pembina Salinan Ditakrifkan Pengguna

Apabila pembina salinan lalai tidak mencukupi, pengaturcara memilih untuk pembina salinan yang ditentukan pengguna untuk mencapai tingkah laku penyalinan tersuai. Ini amat penting dalam situasi di mana penyalinan dari segi ahli, seperti yang dilakukan oleh pembina salinan lalai, gagal memenuhi keperluan yang diingini.

Contoh 1: Penyalinan Dalam Data Yang Diperuntukkan Secara Dinamik

Pertimbangkan kelas dengan pembolehubah ahli yang diperuntukkan secara dinamik, seperti yang digambarkan dalam kod berikut:

<code class="cpp">class Class {
public:
    Class(const char* str);
    ~Class();

private:
    char* stored;
};

Class::Class(const char* str) {
    stored = new char[strlen(str) + 1];
    strcpy(stored, str);
}

Class::~Class() {
    delete[] stored;
}</code>

Dalam contoh ini, penyalinan ahli yang disimpan secara ahli hanya akan menduplikasi penunjuk, bukan penimbal watak sebenar. Akibatnya, apabila salah satu salinan dimusnahkan, ia akan membebaskan memori yang sama yang diperuntukkan oleh salinan lain, yang membawa kepada tingkah laku yang tidak ditentukan. Untuk menyelesaikan isu ini, pembina salinan dalam mesti dilaksanakan untuk menduplikasi penimbal, memastikan setiap salinan mempunyai peruntukan memori bebasnya sendiri:

<code class="cpp">Class::Class(const Class& another) {
    stored = new char[strlen(another.stored) + 1];
    strcpy(stored, another.stored);
}

void Class::operator=(const Class& another) {
    char* temp = new char[strlen(another.stored) + 1];
    strcpy(temp, another.stored);
    delete[] stored;
    stored = temp;
}</code>

Contoh 2: Mengawal Penyalinan Objek Dikira Rujukan

Kelas tertentu mungkin menggunakan pengiraan rujukan untuk mengurus jangka hayat objek yang diperuntukkan secara dinamik. Penyalinan lalai bagi kelas tersebut membawa kepada kiraan rujukan yang salah. Pembina salinan tersuai boleh memastikan pengiraan rujukan yang betul, mengelakkan kebocoran memori atau pemusnahan objek pramatang.

Contoh 3: Menyalin Objek dengan Ahli Tidak Boleh Disalin

Kelas mungkin tidak -pembolehubah ahli boleh disalin, seperti pemegang fail atau sambungan rangkaian. Pembina salinan lalai tidak boleh mengendalikan ahli sedemikian, memerlukan pembina salinan tersuai untuk melakukan tindakan yang sesuai seperti menanggalkan ahli yang tidak boleh disalin semasa penyalinan.

Dengan memahami senario ini, pengaturcara boleh mengenal pasti situasi di mana pembina salinan yang ditentukan pengguna adalah penting, memastikan pemulaan objek yang optimum dan gelagat penyalinan yang selamat dalam aplikasi C mereka.

Atas ialah kandungan terperinci Bilakah Pembina Salinan Ditakrifkan Pengguna Penting dalam C?. 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