Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apabila Mengembalikan Objek Dinamakan mengikut Nilai dalam C , Adakah Peraturan Pergerakan Tersirat Terpakai?

Apabila Mengembalikan Objek Dinamakan mengikut Nilai dalam C , Adakah Peraturan Pergerakan Tersirat Terpakai?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-07 11:00:03640semak imbas

When Returning a Named Object by Value in C  , Does the Implicit Move Rule Apply?

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:

  • test(int): pembina yang menerima hujah integer
  • ujian (): pembina lalai
  • test(const test&): copy constructor
  • test(test&&): move constructor

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:

  • test()
  • test(test&& s)

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:

  • test()
  • test(test&z)

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!

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