Rumah >pembangunan bahagian belakang >C++ >Bilakah Mengembalikan Objek mengikut Nilai Mencetuskan Pembina Pergerakan?

Bilakah Mengembalikan Objek mengikut Nilai Mencetuskan Pembina Pergerakan?

Patricia Arquette
Patricia Arquetteasal
2024-11-04 08:51:30397semak imbas

When Does Returning an Object by Value Trigger a Move Constructor?

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:

  • Ungkapan yang dikembalikan ialah xvalue (ungkapan yang menandakan objek sementara yang bukan lvalue).
  • Kelas bagi objek yang dikembalikan mempunyai pembina bergerak.
  • Pembina bergerak boleh diakses.

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&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

Output:

test()
test(const test&amp;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&amp;&amp; s) { printf("test(test&amp;&amp; s)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>

Output:

test()
test(test&amp;&amp; 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&amp;&amp; z) = delete;
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test&amp; z) { printf("test(const test&amp;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!

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