Rumah >pembangunan bahagian belakang >C++ >Bilakah Mengembalikan Objek mengikut Nilai Mencetuskan Pembina Pergerakan?
Mengembalikan Objek Kelas daripada Fungsi mengikut Nilai
Pertimbangkan kes di mana anda mengembalikan objek kelas daripada fungsi dengan nilai. Dalam senario ini, objek yang dikembalikan biasanya dianggap sebagai nilai, bermakna ia mempunyai nama dan alamat dalam ingatan. Walau bagaimanapun, keadaan tertentu boleh menyebabkan objek yang dikembalikan dianggap sebagai nilai r, objek sementara tanpa nama atau alamat.
Peraturan Pergerakan Tersirat
C mentakrifkan peraturan pergerakan tersirat yang mungkin digunakan apabila mengembalikan objek mengikut nilai. Peraturan ini menyatakan bahawa jika syarat berikut dipenuhi:
Dalam kes sedemikian, pembina bergerak akan digunakan dan bukannya pembina salinan. Tingkah laku ini bertujuan untuk mengoptimumkan prestasi dengan mengelakkan penyalinan yang tidak perlu.
Contoh 1
Dalam contoh ini, objek i yang dikembalikan ialah nilai l, jadi ujian pembina salinan( ujian const& z) digunakan:
<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 Some_thing() { test i; return i; }</code>
Output:
test() test(const test&z)
Contoh 2
Walau bagaimanapun, dalam contoh berikut, objek yang dikembalikan i dianggap sebagai nilai x, dan ujian pembina bergerak(ujian&& s) digunakan kerana objek itu bersifat sementara dan pembina bergerak adalah berdaya maju:
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test&& s) { printf("test(test&& s)\n"); } }; test Some_thing() { test i; return i; }</code>
Output:
test() test(test&& s)
Contoh 3
Jika pembina langkah tidak disediakan atau dipadamkan secara eksplisit, peraturan pergerakan tersirat tidak boleh digunakan dan atur cara akan gagal untuk menyusun:
<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(const test&z)\n"); } }; test Some_thing() { test i; return i; }</code>
Kesimpulan
Apabila mengembalikan objek mengikut nilai, peraturan pergerakan tersirat boleh digunakan di bawah keadaan tertentu, menyebabkan pembina pergerakan digunakan. Memahami tingkah laku ini adalah penting untuk mengoptimumkan kod dan mencegah ralat penyusunan.
Atas ialah kandungan terperinci Bilakah Mengembalikan Objek mengikut Nilai Mencetuskan Pembina Pergerakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!