C ++ bendrinamas_ptr

C Shared_ptr



The shared_ptr yra vienos rūšies išmaniųjų C ++ rodyklių, turinčių bendrąją žymeklio sukurto objekto nuosavybę. Jis dalijasi objekto nuosavybės teise, kai rodyklė saugoma kitame objekte, o bendras nuorodų skaitiklis skaičiuoja savininkų skaičių. The shared_ptr nukopijavus objektą, padidina atskaitos skaitiklį vienu, o sunaikinus objektą - sumažina vieną. Objektui priklausanti atmintis perskirstoma, jei objektas priklauso paskutiniam shared_ptr yra sunaikintas, arba atstatyti () funkcija iškviečia priskirti objektui kitą žymeklį. Kai shared_ptr neturi jokio objekto, tada jis vadinamas tuščiu bendrinamu žymekliu. Įvairūs naudojimo būdai shared_ptr buvo parodyti šioje pamokoje.

1 pavyzdys: bendrų rodyklių paskelbimas įvairiais būdais

Šiame pavyzdyje parodyti trys skirtingi bendros rodyklės deklaravimo būdai. Kode yra deklaruota klasė su konstruktoriumi ir viešuoju metodu. Konstruktorius spausdins pranešimą, kai su konstruktoriumi bus sukurtas naujas bendrinamas objektas. The Ekranas () metodas spausdins pranešimus pagal skambinantį bendrinamą rodyklės objektą. Čia pirmasis bendras rodyklės objektas buvo sukurtas nepaskambinus konstruktoriui. Antrasis bendras rodyklės objektas buvo sukurtas paskambinus konstruktoriui. Trečiasis bendrinamas žymeklis buvo sukurtas priskiriant pirmąjį bendrinamą žymeklį. The Ekranas () metodas buvo iškviestas tris kartus naudojant tris bendrus rodyklės objektus.







// Įtraukti reikiamas bibliotekas

#įtraukti

#įtraukti

usingnamespacestd;

// Apibrėžkite klasę
classMyClass{
viešas:
// Deklaruoti konstruktorių
Mano klasė() {
kaina<<„Konstruktorius vadinamas. n';
}
// Teksto spausdinimo metodo paskelbimas
voidDisplay(eilutė str)
{
kaina<<„Rodymo () metodas vadinamas iš<<p<<'rodyklė. n';
}
};

intmain()
{
// Inicijuokite „shared_ptr“ nepaskambinę konstruktoriui
shared_ptr p1=make_shared();
p1->Ekranas('Pirmas');
// Inicijuokite „shared_ptr“ skambindami konstruktoriui
shared_ptr p2=shared_ptr(newMyClass);
p2->Ekranas('antras');

// Inicijuoti „shared_ptr“ pagal užduotį
shared_ptr p3=p1;
p3->Ekranas('trečias');
grąža0;
}

Išėjimas:



Įvedus pirmiau nurodytą kodą, pasirodys ši išvestis. Konstruktorius skambino tik antrojo objekto kūrimo metu. Taigi konstruktoriaus pranešimas buvo išspausdintas tik vieną kartą:







2 pavyzdys: išspausdinkite bendrinamo rodyklės vietą

Funkcijos get () bendrinamas žymeklis naudojamas grąžinti išsaugotą, bendrinamą rodyklės vietą. Šis pavyzdys atspausdins saugomų bendrinamų rodyklių, sukurtų klasės ir funkcijos, vietą. Čia buvo apibrėžta klasė su konstruktoriumi, kuri bus naudojama kuriant bendrąjį žymeklį. Buvo paskelbta funkcija, skirta sukurti bendrinamą žymeklį ir išspausdinti bendrinamos rodyklės vietą naudojant funkciją get (). Šiame kode pirmas bendrinamas žymeklis buvo sukurtas naudojant klasę, antrasis bendrasis rodiklis buvo sukurtas naudojant funkciją, o trečiasis bendrasis žymeklis buvo sukurtas priskiriant pirmąjį žymeklį.

// Įtraukti reikiamas bibliotekas

#įtraukti

#įtraukti

usingnamespacestd;

// Apibrėžkite klasę
classMyClass
{
viešas:
// Deklaruoti konstruktorių
Mano klasė() {
kaina<<„Konstruktorius vadinamas. n';
}
};
// Nustatykite žymeklio inicijavimo funkciją
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
kaina<<p2.gauti() <<' n';
}

intmain()
{
// Inicijuokite „shared_ptr“ skambindami konstruktoriui
shared_ptr p1=shared_ptr(newMyClass);
kaina<<p1.gauti() <<' n';

// Inicijuokite „shared_ptr“ skambindami
Init_shared_ptr();

// Inicijuoti „shared_ptr“ pagal užduotį
shared_ptr p3=p1;
kaina<<p3.gauti() <<' n';
grąža0;
}

Išėjimas:



Įvykdžius pirmiau nurodytą kodą, pasirodys tokia panaši išvestis. Išvestyje pirmosios ir trečios bendrinamų rodyklių funkcijos get () grąžinta vertė yra ta pati. Tačiau antrasis bendrinamas žymeklis skiriasi:

3 pavyzdys: suskaičiuokite bendrinamus žymeklio objektus

Toliau pateiktame pavyzdyje pavaizduotas būdas suskaičiuoti objektų, kuriuos nurodo bendrasis žymeklis, skaičių sukūrus ir sunaikinus žymeklį. Kode yra deklaruota klasė su konstruktoriumi. Pirmasis bendrinamas žymeklis buvo sukurtas naudojant klasę, o antrasis bendrasis žymeklis buvo sukurtas naudojant pirmąjį bendrinamą žymeklį. Abiejų bendrų rodyklių nurodytų objektų skaičius prieš ir po iškvietimo iš naujo () funkcijos buvo atspausdintas vėliau.

// Įtraukti reikiamas bibliotekas

#įtraukti

#įtraukti

usingnamespacestd;
// Apibrėžkite klasę
classMyClass{
viešas:
// Deklaruoti konstruktorių
Mano klasė() {
kaina<<„Konstruktorius vadinamas. n';
}
};
intmain()
{
// Inicijuokite pirmąjį shared_ptr skambindami konstruktoriui
shared_ptr p1(newMyClass);

// Rodyti „shared_ptr“ objektų skaičių pagal pirmą žymeklį
kaina<<„p1 nurodo“<<p1.use_count() <<“objektas (-ai). n';
// Inicijuokite antrąjį shared_ptr naudodami pirmąjį shared_ptr
shared_ptr p2(p1);
// Rodyti „shared_ptr“ objektų skaičių pagal pirmą ir antrą rodykles
kaina<<„p2 nurodo“<<p2.use_count() <<“objektas (-ai). n';
kaina<<„p1 nurodo“<<p1.use_count() <<“objektas (-ai). n';
// Pašalinkite pirmojo rodyklės nuosavybės teisę iš objekto shared_ptr
p1.atstatyti();
// Rodyti „shared_ptr“ objektų skaičių pagal antrąją žymeklį
kaina<<„p2 nurodo“<<p2.use_count() <<“objektas (-ai). n';
grąža0;
}

Išėjimas:

Įvedus pirmiau nurodytą kodą, pasirodys ši išvestis. Pirmoji rodyklė, p1 , po sukūrimo rodo į vieną objektą. Sukūrę antrąjį žymeklį, p2 , naudojant pirmąją žymeklį, p1 , abi rodyklės nukreipia į du objektus, kad bendrintų rodyklę. Paskambinus rodyklės funkcijai reset (), p1 , vienas objektas buvo sunaikintas, o žymeklis p2 , dabar rodo tik vieną objektą.

Išvada:

Bendros rodyklės naudojimo C ++ tikslai buvo paaiškinti šiame vadove, naudojant paprastus pavyzdžius. Bendrų rodyklių kūrimas įvairiais būdais, saugoma bendrinamų rodyklių vieta ir skaičiuojamas objektų, kuriuos nurodo bendrinami rodyklės, skaičius. Tikiuosi, kad C ++ koduotojai, perskaitę šią mokymo programą, galės naudoti bendrinamą rodyklę savo kode.