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

Susan Sarandon
Lepaskan: 2024-11-05 05:28:02
asal
995 orang telah melayarinya

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>
Salin selepas log masuk

Outputnya ialah:

test()
test(test&& s)
Salin selepas log masuk

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>
Salin selepas log masuk

Output kekal sama seperti dalam Contoh 1:

test()
test(test& z)
Salin selepas log masuk
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Output:

test()
test(test& z)
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan