Ц ++ схаред_птр

C Shared_ptr



Тхе схаред_птр је једна врста паметних показивача Ц ++ која садржи дељено власништво над објектом који је креирао показивач. Он дели власништво над објектом приликом чувања показивача у други објекат, а дељени референтни бројач броји број власника. Тхе схаред_птр повећава бројач референци за један након копирања објекта и смањује бројач референци за један након уништавања објекта. Меморија у власништву објекта се прерасподељује ако је објекат у власништву последњег схаред_птр је уништен, или ресетовање() функција се позива за додељивање другог показивача за објекат. Када схаред_птр не поседује ниједан објекат, тада се назива празним дељеним показивачем. Различите употребе схаред_птр приказани су у овом водичу.

Пример 1: Прогласите дељени показивач на различите начине

Три различита начина декларисања дељеног показивача приказана су у следећем примеру. Класа са конструктором и јавна метода су декларисане у коду. Конструктор ће одштампати поруку када се са конструктором креира нови дељени објекат. Тхе Приказ() метода ће штампати поруке на основу позива дељеног показивачког објекта. Овде је први објекат дељеног показивача креиран без позивања конструктора. Други објекат дељеног показивача креиран је позивањем конструктора. Трећи дељени показивач је креиран додељивањем првог дељеног показивача. Тхе Приказ() метода је три пута позвана коришћењем три објекта дељених показивача.







// Укључује неопходне библиотеке

#инцлуде

#инцлуде

усингнамеспацестд;

// Дефинишите класу
цлассМиЦласс{
јавности:
// Декларишите конструктор
Мој разред() {
цена<<'Конструктор се зове. н';
}
// Проглашавамо метод за штампање текста
воидДисплаи(стринг стр)
{
цена<<'Метода Дисплаи () се позива из'<<п<<'показивач. н';
}
};

интмаин()
{
// Иницијализација схаред_птр без позивања конструктора
схаред_птр п1=маке_схаред();
п1->Приказ('први');
// Иницијализација схаред_птр позивањем конструктора
схаред_птр п2=схаред_птр(невМиЦласс);
п2->Приказ('други');

// Иницијализација схаред_птр додељивањем
схаред_птр п3=п1;
п3->Приказ('трећи');
ретурн0;
}

Излаз:



Следећи излаз ће се појавити након извршавања горњег кода. Конструктор је позвао само у време креирања другог објекта. Дакле, порука конструктора је одштампана само једном:







Пример 2: Одштампајте ускладиштену локацију дељеног показивача

Дељени показивач функције гет () користи се за враћање ускладиштене локације дељеног показивача. Следећи пример ће одштампати локацију ускладиштених, дељених показивача које креирају класа и функција. Овде је дефинисана класа са конструктором која се користи за креирање дељеног показивача. Декларисана је функција за креирање дељеног показивача и штампање локације дељеног показивача помоћу функције гет (). У овом коду, први дељени показивач је креиран помоћу класе, други дељени показивач је креиран помоћу функције, а трећи дељени показивач је креиран додељивањем првог показивача.

// Укључује неопходне библиотеке

#инцлуде

#инцлуде

усингнамеспацестд;

// Дефинишите класу
цлассМиЦласс
{
јавности:
// Декларишите конструктор
Мој разред() {
цена<<'Конструктор се зове. н';
}
};
// Дефинирање функције за иницијализацију показивача
воидИнит_схаред_птр()
{
схаред_птр п2(невМиЦласс);
цена<<п2.добити() <<' н';
}

интмаин()
{
// Иницијализација схаред_птр позивањем конструктора
схаред_птр п1=схаред_птр(невМиЦласс);
цена<<п1.добити() <<' н';

// Покретање схаред_птр позивањем функције
Инит_схаред_птр();

// Иницијализација схаред_птр додељивањем
схаред_птр п3=п1;
цена<<п3.добити() <<' н';
ретурн0;
}

Излаз:



Следећи сличан излаз ће се појавити након извршавања горњег кода. У излазу је враћена вредност гет () функције за први и трећи дељени показивач. Међутим, други дељени показивач је другачији:

Пример 3: Пребројите дељене објекте показивача

Следећи пример приказује начин пребројавања броја објеката на које показује дељени показивач након креирања и уништавања показивача. Класа са конструктором је декларисана у коду. Први дељени показивач је креиран помоћу класе, а други дељени показивач је креиран помоћу првог дељеног показивача. Касније је одштампан број објеката на које указују оба дељена показивача пре и после позивања функције ресет ().

// Укључује неопходне библиотеке

#инцлуде

#инцлуде

усингнамеспацестд;
// Дефинишите класу
цлассМиЦласс{
јавности:
// Декларишите конструктор
Мој разред() {
цена<<'Конструктор се зове. н';
}
};
интмаин()
{
// Покрећемо први схаред_птр позивањем конструктора
схаред_птр п1(невМиЦласс);

// Приказ броја схаред_птр објеката према првом показивачу
цена<<'п1 показује на'<<п1.усе_цоунт() <<објекти. н';
// Покрени други схаред_птр користећи први схаред_птр
схаред_птр п2(п1);
// Приказ броја схаред_птр објеката према првом и другом показивачу
цена<<'п2 показује на'<<п2.усе_цоунт() <<објекти. н';
цена<<'п1 показује на'<<п1.усе_цоунт() <<објекти. н';
// Уклања власништво над првим показивачем из схаред_птр објекта
п1.ресетовање();
// Приказ броја схаред_птр објеката према другом показивачу
цена<<'п2 показује на'<<п2.усе_цоунт() <<објекти. н';
ретурн0;
}

Излаз:

Следећи излаз ће се појавити након извршавања горњег кода. Први показивач, п1 , показује на један објекат након креирања. Након креирања другог показивача, п2 , користећи први показивач, п1 , оба показивача показују на два објекта за дељење показивача. Након позивања функције ресет () за показивач, п1 , један објект је уништен, а показивач, п2 , сада показује само на један објекат.

Закључак:

Сврхе коришћења дељеног показивача у Ц ++ објашњене су у овом водичу помоћу једноставних примера. Креирање дељених показивача на различите начине, добијање ускладиштене локације дељеног показивача и бројање броја објеката на које указују дељени показивачи. Надам се да ће Ц ++ кодери моћи да користе дељени показивач у свом коду након читања овог водича.