C ++ shared_ptr

C Shared_ptr



NS shared_ptr adalah salah satu jenis smart pointer dari C++ yang berisi kepemilikan bersama dari objek yang dibuat oleh pointer. Ini berbagi kepemilikan objek saat menyimpan penunjuk ke objek lain, dan penghitung referensi bersama menghitung jumlah pemilik. NS shared_ptr meningkatkan penghitung referensi satu per satu setelah menyalin objek dan mengurangi penghitung referensi satu per satu setelah menghancurkan objek. Memori yang dimiliki oleh objek dialokasikan kembali jika objek tersebut dimiliki oleh yang terakhir shared_ptr dihancurkan, atau mengatur ulang() fungsi dipanggil untuk menetapkan pointer lain untuk objek. Ketika shared_ptr tidak memiliki objek apa pun, maka itu disebut pointer bersama yang kosong. Penggunaan yang berbeda dari shared_ptr telah ditunjukkan dalam tutorial ini.

Contoh 1: Deklarasikan Pointer Bersama dengan Cara Berbeda

Tiga cara berbeda untuk mendeklarasikan pointer bersama ditunjukkan dalam contoh berikut. Kelas dengan konstruktor dan metode publik telah dideklarasikan dalam kode. Konstruktor akan mencetak pesan ketika objek bersama baru dibuat dengan konstruktor. NS Menampilkan() metode akan mencetak pesan berdasarkan objek penunjuk bersama yang memanggil. Di sini, objek pointer bersama pertama telah dibuat tanpa memanggil konstruktor. Objek pointer bersama kedua telah dibuat dengan memanggil konstruktor. Pointer bersama ketiga telah dibuat dengan menetapkan pointer bersama pertama. NS Menampilkan() metode telah dipanggil tiga kali dengan menggunakan tiga objek pointer bersama.







//Sertakan perpustakaan yang diperlukan

#termasuk

#termasuk

menggunakan namespacestd;

//Tentukan kelasnya
classMyClass{
publik:
//deklarasikan konstruktor
Kelasku() {
biaya<<'Konstruktor dipanggil. ';
}
//Deklarasikan metode untuk mencetak teks
voidDisplay(string str)
{
biaya<<'Metode Display() dipanggil dari '<<P<<' penunjuk. ';
}
};

intmain()
{
//Inisialisasi shared_ptr tanpa memanggil konstruktor
shared_ptr p1=make_shared();
p1->Menampilkan('pertama');
//Inisialisasi shared_ptr dengan memanggil konstruktor
shared_ptr p2=shared_ptr(KelasSaya baru);
p2->Menampilkan('kedua');

//Inisialisasi shared_ptr dengan penugasan
shared_ptr p3=p1;
p3->Menampilkan('ketiga');
kembali0;
}

Keluaran:



Output berikut akan muncul setelah mengeksekusi kode di atas. Konstruktor telah memanggil pada saat pembuatan objek kedua saja. Jadi, pesan konstruktor hanya dicetak satu kali:







Contoh 2: Cetak Lokasi Penunjuk Bersama yang Disimpan

Pointer bersama fungsi get() digunakan untuk mengembalikan lokasi pointer bersama yang disimpan. Contoh berikut akan mencetak lokasi disimpan, pointer bersama yang dibuat oleh kelas dan fungsi. Di sini, kelas dengan konstruktor telah didefinisikan untuk digunakan untuk membuat pointer bersama. Sebuah fungsi telah dideklarasikan untuk membuat pointer bersama dan mencetak lokasi pointer bersama menggunakan fungsi get(). Dalam kode ini, penunjuk bersama pertama telah dibuat menggunakan kelas, penunjuk bersama kedua telah dibuat menggunakan fungsi, dan penunjuk bersama ketiga telah dibuat dengan menetapkan penunjuk pertama.

//Sertakan perpustakaan yang diperlukan

#termasuk

#termasuk

menggunakan namespacestd;

//Tentukan kelasnya
classMyClass
{
publik:
//deklarasikan konstruktor
Kelasku() {
biaya<<'Konstruktor dipanggil. ';
}
};
//Tentukan fungsi untuk menginisialisasi pointer
voidInit_shared_ptr()
{
shared_ptr p2(KelasSaya baru);
biaya<<hal2.Dapatkan() <<' ';
}

intmain()
{
//Inisialisasi shared_ptr dengan memanggil konstruktor
shared_ptr p1=shared_ptr(KelasSaya baru);
biaya<<p1.Dapatkan() <<' ';

//Inisialisasi shared_ptr dengan memanggil fungsi
Init_shared_ptr();

//Inisialisasi shared_ptr dengan penugasan
shared_ptr p3=p1;
biaya<<hal3.Dapatkan() <<' ';
kembali0;
}

Keluaran:



Output serupa berikut akan muncul setelah mengeksekusi kode di atas. Dalam output, nilai yang dikembalikan dari fungsi get() untuk pointer bersama pertama dan ketiga adalah sama. Namun, pointer bersama kedua berbeda:

Contoh 3: Hitung Objek Pointer Bersama

Contoh berikut menggambarkan cara menghitung jumlah objek yang ditunjuk oleh pointer bersama setelah membuat dan menghancurkan pointer. Kelas dengan konstruktor telah dideklarasikan dalam kode. Pointer bersama pertama telah dibuat menggunakan kelas, dan pointer bersama kedua telah dibuat menggunakan pointer bersama pertama. Jumlah objek yang ditunjuk oleh kedua pointer bersama sebelum dan sesudah memanggil fungsi reset() telah dicetak kemudian.

//Sertakan perpustakaan yang diperlukan

#termasuk

#termasuk

menggunakan namespacestd;
//Tentukan kelasnya
classMyClass{
publik:
//deklarasikan konstruktor
Kelasku() {
biaya<<'Konstruktor dipanggil. ';
}
};
intmain()
{
//Inisialisasi shared_ptr pertama dengan memanggil konstruktor
shared_ptr p1(KelasSaya baru);

//Menampilkan jumlah objek shared_ptr dengan pointer pertama
biaya<<'p1 menunjuk ke'<<p1.gunakan_hitung() <<' objek. ';
//Inisialisasi shared_ptr kedua menggunakan shared_ptr pertama
shared_ptr p2(p1);
//Menampilkan jumlah objek shared_ptr dengan pointer pertama dan kedua
biaya<<'p2 menunjuk ke'<<hal2.gunakan_hitung() <<' objek. ';
biaya<<'p1 menunjuk ke'<<p1.gunakan_hitung() <<' objek. ';
//Hapus kepemilikan pointer pertama dari objek shared_ptr
p1.mengatur ulang();
//Menampilkan jumlah objek shared_ptr dengan pointer kedua
biaya<<'p2 menunjuk ke'<<hal2.gunakan_hitung() <<' objek. ';
kembali0;
}

Keluaran:

Output berikut akan muncul setelah mengeksekusi kode di atas. penunjuk pertama, p1 , menunjuk ke satu objek setelah pembuatan. Setelah membuat pointer kedua, p2 , menggunakan penunjuk pertama, p1 , kedua pointer menunjuk ke dua objek untuk berbagi pointer. Setelah memanggil fungsi reset() untuk pointer, p1 , satu objek telah dihancurkan, dan pointer, p2 , sekarang menunjuk ke satu objek saja.

Kesimpulan:

Tujuan menggunakan pointer bersama di C++ telah dijelaskan dalam tutorial ini dengan menggunakan contoh sederhana. Membuat pointer bersama dengan cara yang berbeda, menyimpan lokasi pointer bersama, dan menghitung jumlah objek yang ditunjuk oleh pointer bersama. Saya harap pembuat kode C++ dapat menggunakan pointer bersama dalam kode mereka setelah membaca tutorial ini.