Rumah > Artikel > pembangunan bahagian belakang > Apabila Mengembalikan Objek Dinamakan mengikut Nilai dalam C , Adakah Peraturan Pergerakan Tersirat Terpakai?
Mengembalikan Objek Dinamakan mengikut Nilai dan Peraturan Pergerakan Tersirat
Dalam C , objek boleh dikembalikan daripada fungsi sama ada melalui rujukan atau melalui nilai. Apabila mengembalikan mengikut nilai, objek disalin atau dipindahkan, bergantung pada konteks. Peraturan pergerakan tersirat digunakan apabila mengembalikan objek mengikut nilai daripada fungsi yang objek itu bersifat sementara.
Contoh 1: Move Constructor
Pertimbangkan contoh di bawah:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } test(test&& s)noexcept{ printf("test(test&& s)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
Contoh ini mengembalikan objek jenis ujian mengikut nilai dengan pembina berikut:
Apabila fungsi Some_thing dipanggil, instance ujian dibuat di dalam fungsi secara lalai dan kemudian dikembalikan. Peraturan pergerakan tersirat digunakan dan ujian pembina bergerak(test&&) digunakan untuk mengalihkan objek sementara ke dalam objek yang dikembalikan oleh fungsi.
Oleh itu, output menunjukkan langkah berikut:
Contoh 2: Copy Constructor
Sekarang, mari kita pertimbangkan ini diubah suai contoh:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test& z) { printf("test(test&z)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
Dalam kes ini, ujian pembangun bergerak(ujian&&) tidak tersedia. Sebaliknya, ujian pembina salin(ujian&) digunakan untuk menyalin objek sementara yang dikembalikan oleh fungsi ke dalam objek yang dibuat pada tindanan dalam utama.
Output menunjukkan langkah berikut:
Contoh 3: Deleted Move Constructor
Akhir sekali, jika kita secara eksplisit memadamkan pergerakan pembina seperti ini:
<code class="cpp">class test { public: test(test&& z) = delete; test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(test&z)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
Pembina bergerak tidak boleh digunakan, dan penyusunan akan gagal kerana tiada pembina yang berdaya maju untuk digunakan untuk nilai pulangan.
Kesimpulannya, langkah tersirat peraturan digunakan apabila mengembalikan objek kelas mengikut nilai daripada fungsi yang objek itu bersifat sementara. Jika pembina bergerak tersedia, ia akan digunakan, tetapi jika tidak, pembina salinan akan digunakan sebaliknya. Jika pembina bergerak dipadamkan secara eksplisit, penyusunan akan gagal.
Atas ialah kandungan terperinci Apabila Mengembalikan Objek Dinamakan mengikut Nilai dalam C , Adakah Peraturan Pergerakan Tersirat Terpakai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!