Bolehkah Anda Menetapkan kepada Nilai R Jenis Kelas dalam C?

DDD
Lepaskan: 2024-10-28 09:26:29
asal
664 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!