Rumah >pembangunan bahagian belakang >C++ >Bolehkah Anda Menetapkan kepada Nilai R Jenis Kelas dalam C?

Bolehkah Anda Menetapkan kepada Nilai R Jenis Kelas dalam C?

DDD
DDDasal
2024-10-28 09:26:29747semak imbas

 Can You Assign to an Rvalue of Class Type in C  ?

Tugasan kepada Nilai R Jenis Kelas

Gambaran Keseluruhan

Dalam bahasa pengaturcaraan C, nilai r (nilai sebelah kanan) biasanya tidak boleh digunakan sebagai nilai l ( nilai sebelah kiri). Walau bagaimanapun, terdapat pengecualian kepada peraturan ini, seperti yang digambarkan oleh kod berikut:

<code class="cpp">class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}</code>

Anehnya, kod ini berjaya menyusun, walaupun objek yang dikembalikan oleh pembina Y(1) ialah nilai r. Artikel ini meneroka sebab di sebalik tingkah laku yang tidak dijangka ini.

Tugasan kepada Nilai R Jenis Kelas

Kunci untuk memahami sebab kod ini sah terletak pada konsep fungsi ahli yang disintesis. Untuk kelas yang tidak mentakrifkan pengendali tugasan secara eksplisit, pengkompil menjana pengendali tugasan lalai. Pengendali lalai ini ialah fungsi ahli yang mengambil rujukan kepada objek kelas yang sama dengan parameternya.

Dalam contoh di atas, pengendali tugasan untuk kelas Y disintesis seperti berikut:

<code class="cpp">Y& Y::operator=(const Y& other);</code>

Terutamanya, pengendali tugasan tersintesis ini ialah fungsi bukan ahli const. Ini bermakna ia boleh digunakan pada kedua-dua nilai l (objek dirujuk) dan nilai r (objek tidak dirujuk).

Nilai Pulangan Pembina

Apabila objek dicipta menggunakan pembina yang mengembalikan nilai r, pengkompil menjana objek sementara dalam ingatan. Objek sementara ini dimusnahkan secara automatik pada penghujung pernyataan di mana ia dicipta. Walau bagaimanapun, dalam kes di mana pembina mengembalikan nilai r jenis kelas, pengendali tugasan yang disintesis boleh memanjangkan hayat objek sementara.

Sintaks Tugasan

Pernyataan tugasan Y(1) = Y(0); ialah gula sintaktik untuk kod berikut:

<code class="cpp">Y(1).operator=(Y(0));</code>

Seperti yang telah kami tetapkan, operator pengendali tugasan tersintesis= untuk kelas Y ialah fungsi bukan ahli const, bermakna ia boleh digunakan pada nilai r. Oleh itu, pengkompil boleh mentafsirkan pernyataan tugasan sebagai tugasan kepada objek sementara yang dicipta oleh pembina Y(1).

Kesimpulan

Bertentangan dengan apa yang biasanya dijangkakan, adalah mungkin untuk menetapkan kepada nilai r jenis kelas dalam C kerana pengkompil mensintesis pengendali tugasan bukan const untuk kelas tanpa pengendali tugasan yang ditakrifkan dengan jelas. Pengendali tugasan yang disintesis ini memanjangkan hayat objek sementara yang dicipta oleh pembina, membenarkan tugasan kepada nilai.

Atas ialah kandungan terperinci Bolehkah Anda Menetapkan kepada Nilai R Jenis Kelas 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