C++ Pindahkan Konstruktor

C Pindahkan Konstruktor



Pemrograman C++ adalah bahasa terbaik karena memfasilitasi kita dengan berbagai fungsi, konstruktor, file header, kelas, dan banyak lagi, membuat pengkodean lebih menarik dan mudah. Salah satu konstruktor dalam pemrograman C++ adalah konstruktor “pindah”. Konstruktor “pindah” adalah jenis konstruktor unik yang memungkinkan kepemilikan memori yang dialokasikan secara dinamis atau sumber daya lain untuk ditransfer dari satu objek ke objek lainnya dengan cara yang efektif dan sadar sumber daya.

Dalam pemrograman C++, konstruktor “pindah” diperkenalkan untuk mengurangi duplikasi dan meningkatkan efisiensi. Ini memainkan peran penting dalam meningkatkan kinerja dengan meminimalkan operasi penyalinan. Panduan ini mengeksplorasi secara mendalam tentang konstruktor “pindah” dalam pemrograman C++.







Contoh 1:

Untuk memulai kode di sini, kami menyertakan file header “iostream” dan “string” yang akan membuat kode kami berjalan dengan sempurna karena banyak fungsi yang dideklarasikan dalam file header ini. Ketika kita harus menggunakan pernyataan “cout”, file header “iostream” digunakan karena fungsi ini dideklarasikan di dalamnya. Ketika kita harus bekerja dengan data tipe string, file header “string” diperlukan.



Setelah ini, 'namespace std' ditambahkan di bawah file header ini. Kemudian, kami membangun kelas di sini. Nama kelasnya adalah 'Pindah'. Di bawahnya, kata kunci “pribadi” ditambahkan di mana kita mendeklarasikan variabel string pribadi dengan nama “my_str”. Sekarang, kita menempatkan kata kunci “publik” di mana kita menambahkan definisi konstruktor default. Kami meneruskan 'Ini adalah string default di sini' ke 'my_str' sebagai parameter dan membiarkan konstruktor default kosong.



Setelah ini, kita menyalin definisi konstruktor dan menginisialisasi “my_str” ke “my_obj.my_str”. Di bawahnya, kita mencetak sebuah garis dan kemudian menempatkan definisi konstruktor “pindah”. Di sini, kita menginisialisasi “my_str” lagi dengan “my_obj.my_str”. Kami tidak menambahkan pernyataan apa pun di bawah ini; ini kosong. Setelah ini, kita mendeklarasikan fungsi bernama “displayMyObject()” bertipe string dan menggunakan “return str” sehingga mengembalikan string tersebut.





Kami menempatkan fungsi global “new_temp” dalam tipe “move”. Di bawahnya, kita memiliki 'return temp' yang mengembalikan objek tipe perpindahan. Sekarang, kita menempatkan kode driver “main()” dan “new_obj1” dari tipe “move” dan mendapatkan konstruktor “move” dari “rvalue”. Di baris depan, kita menempatkan “new_obj1.displayMyObject()” untuk mendapatkan konstruktor “move” dari “lvalue”. Setelah ini, kita memanggil konstruktor “move” dengan objek “my_obj1”. Kemudian, kami mentransfer kepemilikan “my_obj1” ke objek lain yaitu “my_obj2”.

Kode 1:

#termasuk

#termasuk

menggunakan ruang nama std ;

kelas Bergerak

{

pribadi :
string my_str ;
publik :
Bergerak ( ) : my_str ( 'Ini adalah string default di sini' )
{
}
Bergerak ( konstanta Bergerak & objek_saya ) : my_str ( objek_saya. my_str )
{


cout << 'Salin konstruktor dipanggil, Pemindahan gagal! \N ' ;

}
Bergerak ( Bergerak && objek_saya ) : my_str ( bergerak ( objek_saya. my_str ) )
{
}
string menampilkan Objek Saya ( )
{
kembali my_str ;
}
} ;
Pindahkan new_temp ( Pindahkan tmp )
{
kembali tmp ;
}
ke dalam utama ( )
{
Pindahkan objek_baru1 = suhu_baru ( Bergerak ( ) ) ;


cout << 'sebelum pindah() panggilan : new_obj1 = ' << objek_baru1. tampilkan Objek Saya ( ) << akhir ;

Pindahkan objek_baru2 = bergerak ( objek_baru1 ) ;

cout << 'setelah panggilan konstruktor move() : new_obj1 = ' << objek_baru1. tampilkan Objek Saya ( ) << akhir ;

cout << 'setelah panggilan konstruktor move() : new_obj2 = ' << objek_baru2. tampilkan Objek Saya ( ) << akhir ;

kembali 0 ;

}

Keluaran:

Outputnya menampilkan bahwa sebelum memanggil metode “move()”, “new_obj1” berisi string default. Namun setelah memanggil metode move() kelas “Move”, “my_obj1” berisi string kosong dan “my_obj2” memiliki string default.



Contoh 2:

Di sini, kami menyertakan satu lagi file header yaitu file header “vektor”. Kami menyertakan ini setiap kali kami harus memanipulasi operasi pada vektor. Kelas yang kita buat disini adalah kelas “Move”. Kami juga membuat konstruktor 'publik' di sini di mana kami mendeklarasikan penunjuk mentah 'int* value' sebagai data anggota kelas. Di bawahnya, kita memiliki 'publik' di mana kita menempatkan konstruktor 'Pindahkan' dan meneruskan 'int v1' sebagai parameternya.

Setelah ini, kami mendeklarasikan objek dalam heap. Kami menginisialisasi 'nilai' dengan 'int baru' dan '*nilai' dengan 'v1'. Kemudian, tempatkan “cout” di mana kita menambahkan baris yang tercetak saat kita mengeksekusi kode. Di bawah ini, kami menggunakan konstruktor “copy”. Konstruktor “salinan” ini menyalin data dengan membuat salinan mendalam. Kami menempatkan konstruktor “Pindahkan” dan meneruskan “Pindahkan&& sumber_baru” sebagai parameternya. Di bawahnya, kami menempatkan “cout” yang membantu menampilkan pernyataan yang diperlukan.

Kami memasukkan kata kunci “nullptr” untuk menentukan apakah pointer kosong sebelum referensi digunakan. Sekarang, kita juga menempatkan destruktor “~Move()” di mana kita menempatkan kondisi “if” yang memverifikasi apakah “nilai” tidak sama dengan “nullptr”. Ketika kondisi ini diverifikasi, pernyataan di bawah ini dijalankan. Jika kondisi ini tidak diverifikasi, pernyataan “cout” yang ada setelah kondisi “if” akan dilewati dan berpindah ke bagian “else”.

Setelah ini, kita menggunakan kata kunci “delete” yang membantu membatalkan alokasi suatu objek atau kita dapat mengatakan bahwa ini melepaskan memori yang dialokasikan ke komponen data objek. Sekarang, kita memanggil metode “main()” di sini dan membuat vektor kelas “Move” kita dengan nama, “my_vec”. Setelah ini, kami menggunakan fungsi “push_back()” yang membantu memasukkan nilai pada titik akhir vektor. File header 'vektor' berisi fungsi ini. Pertama, kita masukkan “39” ke dalam vektor. Kemudian dimasukkan “57” dan “91” juga dimasukkan dengan memanfaatkan metode “push_back()”.

Kode 2:

#termasuk

#termasuk

menggunakan ruang nama std ;

kelas Bergerak {

pribadi :
ke dalam * nilai ;
publik :
Bergerak ( ke dalam v1 )
{
nilai = baru ke dalam ;
* nilai = v1 ;

cout << 'Konstruktor dipanggil'

<< v1 << akhir ;

} ;
Bergerak ( konstanta Bergerak & sumber_baru )
: Bergerak { * sumber_baru. nilai }
{


cout << 'Copy Konstruktor disebut -'

<< 'Salinan mendalam untuk'

<< * sumber_baru. nilai

<< akhir ;

}
Bergerak ( Bergerak && sumber_baru )
: nilai { sumber_baru. nilai }
{


cout << 'Pindahkan Konstruktor untuk'

<< * sumber_baru. nilai << akhir ;

sumber_baru. nilai = nullptr ;

}
~ Bergerak ( )
{
jika ( nilai ! = nullptr )


cout << 'Destructor dipanggil untuk'

<< * nilai << akhir ;

kalau tidak

cout << 'Destruktor disebut'

<< 'untuk nullptr'

<< akhir ;

menghapus nilai ;

}

} ;

ke dalam utama ( )

{

vektor < Bergerak > barang_saya ;

barang_saya. dorong_kembali ( Bergerak { 39 } ) ;
barang_saya. dorong_kembali ( Bergerak { 57 } ) ;
barang_saya. dorong_kembali ( Bergerak { 91 } ) ;
kembali 0 ;


}

Keluaran:

Hal ini menunjukkan bahwa alih-alih menggunakan fungsi “salin”, kita harus menggunakan fungsi “pindah” untuk mencegah pemanggilan fungsi “salin” yang tidak perlu. Konstruktor “pindah” dipanggil di sini ketika kita menginisialisasi objek dengan objek sementara atau beberapa objek yang akan dimusnahkan. Alih-alih memanipulasi salinan mendalam dari data yang diberikan, konstruktor “pindah” mengalihkan kepemilikan sumber daya dari satu objek ke objek lainnya.

Kesimpulan

Dalam panduan ini, kita mempelajari tentang konstruktor “pindah”. Kami menjelaskan bahwa konstruktor “pindah” dalam pemrograman C++ adalah metode unik untuk memindahkan sumber daya suatu objek ke objek lain secara efektif. Kita telah membahas bahwa pemanggilan konstruktor “move” memiliki overhead yang lebih sedikit, sehingga membuat kode lebih hemat memori. Kami mengeksplorasi fakta bahwa konstruktor “pindah” adalah fitur canggih dalam pemrograman C++. Kami juga menggunakan contoh praktis untuk mengilustrasikan konsep konstruktor “pindah” dan menunjukkan manfaat kinerja menggunakan konstruktor “pindah” dalam pemrograman C++.