C ++ berkongsi_ptr

C Shared_ptr



The dikongsi_ptr adalah salah satu jenis penunjuk pintar C ++ yang mengandungi pemilikan bersama objek yang dibuat oleh penunjuk. Ia berkongsi kepemilikan objek ketika menyimpan penunjuk ke objek lain, dan kaunter rujukan bersama mengira jumlah pemilik. The dikongsi_ptr meningkatkan kaunter rujukan satu demi satu setelah menyalin objek dan menurunkan pembilang rujukan satu demi satu setelah memusnahkan objek. Memori yang dimiliki oleh objek dialokasikan semula jika objek yang dimiliki oleh yang terakhir dikongsi_ptr dimusnahkan, atau tetapkan semula () fungsi dipanggil untuk memberikan penunjuk lain untuk objek. Apabila dikongsi_ptr tidak memiliki objek, maka ia dipanggil penunjuk bersama yang kosong. Penggunaan yang berbeza dari dikongsi_ptr telah ditunjukkan dalam tutorial ini.

Contoh 1: Menyatakan Pointer Dikongsi dalam Cara Berbeza

Tiga cara berbeza untuk menyatakan penunjuk bersama ditunjukkan dalam contoh berikut. Kelas dengan konstruktor dan kaedah awam telah dinyatakan dalam kod. Pembina akan mencetak mesej apabila objek kongsi baru dibuat dengan pembina. The Paparan () kaedah akan mencetak mesej berdasarkan objek penunjuk yang dikongsi bersama. Di sini, objek penunjuk yang dikongsi pertama telah dibuat tanpa memanggil pembina. Objek penunjuk bersama kedua telah dibuat dengan memanggil pembina. Penunjuk kongsi ketiga telah dibuat dengan menetapkan penunjuk kongsi pertama. The Paparan () kaedah telah dipanggil tiga kali dengan menggunakan tiga objek penunjuk yang dikongsi.







// Sertakan perpustakaan yang diperlukan

#sertakan

#sertakan

menggunakannamapacestd;

// Tentukan kelas
classMyClass{
awam:
// Menyatakan pembina
Kelas saya() {
kos<<'Pembina dipanggil. n';
}
// Menyatakan kaedah untuk mencetak teks
kekosongan(tali tali)
{
kos<<'Kaedah Paparan () dipanggil dari'<<hlm<<'penunjuk. n';
}
};

antara()
{
// Permulaan shared_ptr tanpa memanggil konstruktor
dikongsi_ptr p1=buat_kongsi();
p1->Paparan('pertama');
// Permulaan shared_ptr dengan memanggil konstruktor
dikongsi_ptr p2=dikongsi_ptr(newMyClass);
hlm2->Paparan('kedua');

// Permulaan shared_ptr mengikut tugasan
dikongsi_ptr p3=p1;
hlm3->Paparan('ketiga');
pulangan0;
}

Pengeluaran:



Output berikut akan muncul setelah melaksanakan kod di atas. Pembina telah memanggil pada saat penciptaan objek kedua sahaja. Oleh itu, mesej pembina telah dicetak sekali sahaja:







Contoh 2: Cetak Lokasi Penunjuk Bersama Tersimpan

Penunjuk bersama fungsi get () digunakan untuk mengembalikan lokasi penunjuk yang dikongsi dan disimpan. Contoh berikut akan mencetak lokasi penunjuk yang disimpan dan dikongsi yang dibuat oleh kelas dan fungsinya. Di sini, kelas dengan konstruktor telah ditentukan untuk digunakan untuk membuat penunjuk bersama. Fungsi telah dinyatakan untuk membuat penunjuk bersama dan mencetak lokasi penunjuk bersama menggunakan fungsi get (). Dalam kod 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

#sertakan

#sertakan

menggunakannamapacestd;

// Tentukan kelas
classMyClass
{
awam:
// Menyatakan pembina
Kelas saya() {
kos<<'Pembina dipanggil. n';
}
};
// Tentukan fungsi untuk memulakan penunjuk
voidInit_shared_ptr()
{
dikongsi_ptr p2(newMyClass);
kos<<hlm2.dapatkan() <<' n';
}

antara()
{
// Permulaan shared_ptr dengan memanggil konstruktor
dikongsi_ptr p1=dikongsi_ptr(newMyClass);
kos<<p1.dapatkan() <<' n';

// Permulaan shared_ptr dengan memanggil fungsi
Init_shared_ptr();

// Permulaan shared_ptr mengikut tugasan
dikongsi_ptr p3=p1;
kos<<hlm3.dapatkan() <<' n';
pulangan0;
}

Pengeluaran:



Keluaran serupa berikut akan muncul setelah melaksanakan kod di atas. Dalam output, nilai dikembalikan fungsi get () untuk petunjuk bersama pertama dan ketiga adalah sama. Walau bagaimanapun, penunjuk yang dikongsi kedua berbeza:

Contoh 3: Kira Objek Penunjuk Berkongsi

Contoh berikut menggambarkan cara menghitung jumlah objek yang ditunjukkan oleh penunjuk bersama setelah membuat dan memusnahkan penunjuk. Kelas dengan konstruktor telah dinyatakan dalam kod. Penunjuk kongsi pertama telah dibuat menggunakan kelas, dan penunjuk kongsi kedua telah dibuat menggunakan penunjuk kongsi pertama. Bilangan objek yang ditunjukkan oleh kedua-dua penunjuk bersama sebelum dan selepas memanggil fungsi reset () telah dicetak kemudian.

// Sertakan perpustakaan yang diperlukan

#sertakan

#sertakan

menggunakannamapacestd;
// Tentukan kelas
classMyClass{
awam:
// Menyatakan pembina
Kelas saya() {
kos<<'Pembina dipanggil. n';
}
};
antara()
{
// Permulaan shared_ptr pertama dengan memanggil konstruktor
dikongsi_ptr p1(newMyClass);

// Paparkan bilangan objek shared_ptr dengan penunjuk pertama
kos<<'p1 menunjuk ke'<<p1.gunakan_kira() <<'objek. n';
// Permulaan shared_ptr kedua menggunakan shared_ptr pertama
dikongsi_ptr p2(p1);
// Paparkan bilangan objek shared_ptr dengan petunjuk pertama dan kedua
kos<<'p2 menunjuk ke'<<hlm2.gunakan_kira() <<'objek. n';
kos<<'p1 menunjuk ke'<<p1.gunakan_kira() <<'objek. n';
// Keluarkan hak milik penunjuk pertama dari objek shared_ptr
p1.tetapkan semula();
// Paparkan bilangan objek shared_ptr dengan penunjuk kedua
kos<<'p2 menunjuk ke'<<hlm2.gunakan_kira() <<'objek. n';
pulangan0;
}

Pengeluaran:

Output berikut akan muncul setelah melaksanakan kod di atas. Penunjuk pertama, p1 , menunjuk ke satu objek selepas penciptaan. Setelah membuat penunjuk kedua, hlm2 , menggunakan penunjuk pertama, p1 , kedua-dua penunjuk menunjuk ke dua objek untuk berkongsi penunjuk. Setelah memanggil fungsi reset () untuk penunjuk, p1 , satu objek telah musnah, dan penunjuknya, hlm2 , kini menunjuk ke satu objek sahaja.

Kesimpulan:

Tujuan penggunaan penunjuk bersama di C ++ telah dijelaskan dalam tutorial ini dengan menggunakan contoh-contoh sederhana. Membuat penunjuk bersama dengan cara yang berbeza, mendapatkan lokasi penunjuk kongsi yang tersimpan, dan mengira jumlah objek yang ditunjukkan oleh penunjuk yang dikongsi. Saya harap pengekod C ++ dapat menggunakan penunjuk yang dikongsi dalam kod mereka setelah membaca tutorial ini.