C++ shared_ptr

C Shared_ptr



ten shared_ptr jest jednym z typów inteligentnych wskaźników C++, które zawierają współwłasność obiektu utworzonego przez wskaźnik. Współdzieli własność obiektu podczas przechowywania wskaźnika w innym obiekcie, a współużytkowany licznik odwołań zlicza liczbę właścicieli. ten shared_ptr zwiększa licznik referencji o jeden po skopiowaniu obiektu i zmniejsza licznik referencji o jeden po zniszczeniu obiektu. Pamięć należąca do obiektu jest ponownie przydzielana, jeśli obiekt należący do ostatniego shared_ptr jest zniszczony lub Resetowanie() Funkcja jest wywoływana, aby przypisać inny wskaźnik do obiektu. Kiedy shared_ptr nie posiada żadnego obiektu, to nazywa się to pustym wspólnym wskaźnikiem. Różne zastosowania shared_ptr zostały pokazane w tym samouczku.

Przykład 1: Deklaracja wskaźnika współdzielonego na różne sposoby

W poniższym przykładzie pokazano trzy różne sposoby deklarowania wskaźnika udostępnionego. W kodzie została zadeklarowana klasa z konstruktorem i metodą publiczną. Konstruktor wyświetli komunikat, gdy za pomocą konstruktora zostanie utworzony nowy obiekt współdzielony. ten Wyświetlacz() Metoda wyświetli komunikaty na podstawie wywołującego obiektu wskaźnika współdzielonego. Tutaj pierwszy współdzielony obiekt wskaźnika został utworzony bez wywoływania konstruktora. Drugi współdzielony obiekt wskaźnika został utworzony przez wywołanie konstruktora. Trzeci wspólny wskaźnik został utworzony przez przypisanie pierwszego wspólnego wskaźnika. ten Wyświetlacz() Metoda została wywołana trzykrotnie przy użyciu trzech wspólnych obiektów wskaźnika.







//Dołącz niezbędne biblioteki

#włączać

#włączać

przy użyciu namespacestd;

//Zdefiniuj klasę
classMojaKlasa{
publiczny:
//Zadeklaruj konstruktor
Moja klasa() {
koszt<<„Konstruktor nazywa się. ';
}
//Zadeklaruj metodę drukowania tekstu
voidDisplay(str)
{
koszt<<'Metoda Display() jest wywoływana z '<<P<<wskaźnik. ';
}
};

intmain()
{
//Zainicjuj shared_ptr bez wywoływania konstruktora
shared_ptr p1=make_shared();
p1->Wyświetlacz('pierwszy');
//Zainicjuj shared_ptr, wywołując konstruktor
shared_ptr p2=shared_ptr(nowaMojaKlasa);
p2->Wyświetlacz('druga');

//Zainicjuj shared_ptr przez przypisanie
shared_ptr p3=p1;
p3->Wyświetlacz('trzeci');
powrót0;
}

Wyjście:



Poniższe dane wyjściowe pojawią się po wykonaniu powyższego kodu. Konstruktor wywołał tylko w momencie tworzenia drugiego obiektu. Tak więc wiadomość konstruktora została wydrukowana tylko raz:







Przykład 2: Wydrukuj zapisaną lokalizację wspólnego wskaźnika

Wspólny wskaźnik funkcji get() służy do zwracania zapisanej lokalizacji wspólnego wskaźnika. Poniższy przykład wyświetli lokalizację przechowywanych, udostępnionych wskaźników, które są tworzone przez klasę i funkcję. Tutaj zdefiniowano klasę z konstruktorem, która służy do tworzenia wspólnego wskaźnika. Została zadeklarowana funkcja do tworzenia wspólnego wskaźnika i drukowania lokalizacji wspólnego wskaźnika za pomocą funkcji get(). W tym kodzie pierwszy wspólny wskaźnik został utworzony przy użyciu klasy, drugi wspólny wskaźnik został utworzony przy użyciu funkcji, a trzeci wspólny wskaźnik został utworzony przez przypisanie pierwszego wskaźnika.

//Dołącz niezbędne biblioteki

#włączać

#włączać

przy użyciu namespacestd;

//Zdefiniuj klasę
classMojaKlasa
{
publiczny:
//Zadeklaruj konstruktor
Moja klasa() {
koszt<<„Konstruktor nazywa się. ';
}
};
//Zdefiniuj funkcję do inicjalizacji wskaźnika
voidInit_shared_ptr()
{
shared_ptr p2(nowaMojaKlasa);
koszt<<p2.dostwać() <<' ';
}

intmain()
{
//Zainicjuj shared_ptr, wywołując konstruktor
shared_ptr p1=shared_ptr(nowaMojaKlasa);
koszt<<p1.dostwać() <<' ';

//Zainicjuj shared_ptr, wywołując funkcję
Init_shared_ptr();

//Zainicjuj shared_ptr przez przypisanie
shared_ptr p3=p1;
koszt<<p3.dostwać() <<' ';
powrót0;
}

Wyjście:



Następujące podobne dane wyjściowe pojawią się po wykonaniu powyższego kodu. Na wyjściu zwracana wartość funkcji get() dla pierwszego i trzeciego wspólnego wskaźnika jest taka sama. Jednak drugi wspólny wskaźnik jest inny:

Przykład 3: Policz współdzielone obiekty wskaźnikowe

Poniższy przykład przedstawia sposób zliczania liczby obiektów wskazywanych przez wspólny wskaźnik po utworzeniu i zniszczeniu wskaźnika. W kodzie została zadeklarowana klasa z konstruktorem. Pierwszy wspólny wskaźnik został utworzony przy użyciu klasy, a drugi wspólny wskaźnik został utworzony przy użyciu pierwszego wspólnego wskaźnika. Liczba obiektów wskazywanych przez oba wspólne wskaźniki przed i po wywołaniu funkcji reset() została wydrukowana później.

//Dołącz niezbędne biblioteki

#włączać

#włączać

przy użyciu namespacestd;
//Zdefiniuj klasę
classMojaKlasa{
publiczny:
//Zadeklaruj konstruktor
Moja klasa() {
koszt<<„Konstruktor nazywa się. ';
}
};
intmain()
{
//Zainicjuj pierwszy shared_ptr, wywołując konstruktor
shared_ptr p1(nowaMojaKlasa);

//Wyświetl liczbę obiektów shared_ptr przy pierwszym wskaźniku
koszt<<'p1 wskazuje na '<<p1.liczba_użytków() <<obiekt(y). ';
//Zainicjuj drugi shared_ptr przy użyciu pierwszego shared_ptr
shared_ptr p2(p1);
//Wyświetl liczbę obiektów shared_ptr za pomocą pierwszego i drugiego wskaźnika
koszt<<'p2 wskazuje na '<<p2.liczba_użytków() <<obiekt(y). ';
koszt<<'p1 wskazuje na '<<p1.liczba_użytków() <<obiekt(y). ';
//Usuń własność pierwszego wskaźnika z obiektu shared_ptr
p1.Resetowanie();
//Wyświetl liczbę obiektów shared_ptr przy drugim wskaźniku
koszt<<'p2 wskazuje na '<<p2.liczba_użytków() <<obiekt(y). ';
powrót0;
}

Wyjście:

Poniższe dane wyjściowe pojawią się po wykonaniu powyższego kodu. Pierwszy wskaźnik, p1 , wskazuje na jeden obiekt po utworzeniu. Po utworzeniu drugiego wskaźnika, p2 , używając pierwszego wskaźnika, p1 , oba wskaźniki wskazują dwa obiekty w celu udostępnienia wskaźnika. Po wywołaniu funkcji reset() dla wskaźnika, p1 , jeden obiekt został zniszczony, a wskaźnik, p2 , wskazuje teraz tylko jeden obiekt.

Wniosek:

Cele używania wspólnego wskaźnika w C++ zostały wyjaśnione w tym samouczku za pomocą prostych przykładów. Tworzenie współdzielonych wskaźników na różne sposoby, uzyskiwanie przechowywanej lokalizacji współdzielonego wskaźnika i liczenie liczby obiektów wskazywanych przez współdzielone wskaźniki. Mam nadzieję, że koderzy C++ będą mogli używać wspólnego wskaźnika w swoim kodzie po przeczytaniu tego samouczka.