Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bilakah Move Constructor Digunakan untuk Mengembalikan Objek Dinamakan mengikut Nilai dalam C?

Bilakah Move Constructor Digunakan untuk Mengembalikan Objek Dinamakan mengikut Nilai dalam C?

Susan Sarandon
Susan Sarandonasal
2024-11-05 05:28:02931semak imbas

When is the Move Constructor Used for Returning Named Objects by Value in C  ?

Mengembalikan Objek Dinamakan mengikut Nilai daripada Fungsi dan Peraturan Pergerakan Tersirat

Pertimbangkan situasi di mana objek kelas generik dikembalikan oleh nilai daripada fungsi. Dalam Contoh 1:

<code class="cpp">class test {
public:
    test() {
        printf(" test()\n");
    }
    test(test&& s) {
        printf(" test(test&& s)\n");
    }
    test& operator=(test e) {
        printf(" test& operator=( test e)\n");
        return *this;
    }
};

test Some_thing() {
    test i;
    return i;
}</code>

Outputnya ialah:

test()
test(test&& s)

Dalam contoh ini, ujian pembina() dipanggil untuk objek LValue yang saya buat dalam fungsi, dan pergerakan ujian pembina(test&& s) dipanggil apabila objek i dikembalikan mengikut nilai, kerana ungkapan return i ialah rujukan nilai.

Dalam Contoh 2, ujian pembina salinan(ujian& z) disediakan, tetapi pembina bergerak tidak disintesis oleh pengkompil:

<code class="cpp">class test {
public:
    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;
}</code>

Output kekal sama seperti dalam Contoh 1:

test()
test(test& z)

Pembina salinan digunakan kerana tiada pembina bergerak tersedia.

Dalam Contoh 3, pembina bergerak dipadamkan secara eksplisit:

<code class="cpp">class test {
public:
    test(test&& z) = delete; // Deleted move constructor

    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;
}</code>

Cuba untuk menyusun kod ini akan mengakibatkan ralat, kerana pembina pergerakan yang dipadam bermakna tiada operasi pemindahan boleh dilakukan.

Dalam Contoh 4, walaupun pembina bergerak dipadamkan, kod menyusun dan runs:

<code class="cpp">class test {
public:
    test(test&& z) = delete;

    test() {
        printf(" test()\n");
    }
    test(test& z) {
        printf(" test(test& z)\n");
    }
    test& operator=(test e) {
        printf(" test& operator=( test e)\n");
        return *this;
    }
};

int main() {
    test u;
    test r(u); // Copy constructor is used
    return 0;
}</code>

Output:

test()
test(test& z)

Dalam contoh ini, r(u) mencipta objek baru r dengan menyalin objek u. Pembina langkah tidak digunakan kerana ia dipadamkan, dan pembina salin digunakan sebaliknya.

Pendapat utama ialah sama ada pembina langkah digunakan atau tidak bergantung pada ketersediaan pembina langkah yang berdaya maju dan peraturan untuk resolusi beban berlebihan. Jika pembangun bergerak tersedia dan berdaya maju, ia boleh digunakan untuk memulakan nilai yang dikembalikan daripada fungsi, walaupun ungkapan yang digunakan untuk mengembalikan nilai ialah LValue.

Atas ialah kandungan terperinci Bilakah Move Constructor Digunakan untuk Mengembalikan Objek Dinamakan mengikut Nilai dalam C?. 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