C++'ta Akıllı İşaretçiler
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 15 / 104.
Akıllı işaretçiler, yığın belleğini sizin için otomatik olarak yöneten sarmalayıcı sınıflardır. İşaretçi kapsam dışına çıktığında belleği temizleyerek manuel delete çağrıları yapma gereğini ortadan kaldırırlar.
Akıllı işaretçileri kullanmak için <memory> başlığını dahil edin.
unique_ptr - özel sahiplik. Bir seferde kaynağın sahibi yalnızca bir işaretçi olabilir.
#include <memory>
std::unique_ptr<Player> player = std::make_unique<Player>("Hero");
player->attack(); // Normal bir işaretçi gibi kullanın
// Kopyalanamaz, ancak sahiplik devredilebilir
std::unique_ptr<Player> player2 = std::move(player);
// player artık nullptr'dirshared_ptr - paylaşımlı sahiplik. Birden çok işaretçi aynı kaynağa sahip olabilir. Bellek, son sahip yok edildiğinde serbest bırakılır.
std::shared_ptr<Player> p1 = std::make_shared<Player>("Hero");
std::shared_ptr<Player> p2 = p1; // Her ikisi de kaynağa sahiptir
std::cout << p1.use_count(); // 2 yazdırırweak_ptr - bir shared_ptr’ın sahiplik taşımayan gözlemcisi. Döngüsel başvuruları kırmak için kullanışlıdır.
std::shared_ptr<Player> shared = std::make_shared<Player>("Hero");
std::weak_ptr<Player> weak = shared;
if (auto locked = weak.lock()) { // shared_ptr'a dönüştür
locked->attack();
}Tekil sahiplik için varsayılan olarak unique_ptr kullanın. Birden fazla nesnenin bir kaynağı paylaşması gerektiğinde shared_ptr kullanın. Yaşam süresini uzatmadan gözlemlemek için weak_ptr kullanın.
Ham new yerine make_unique ve make_shared kullanmayı tercih edin.
Görev
KolayAkıllı işaretçilerin farklı sahiplik modellerini gösteren bir belge paylaşım sistemi oluşturalım. unique_ptr'nin özel sahipliği nasıl zorunlu kıldığını, shared_ptr'nin birden çok sahibin olmasına nasıl izin verdiğini ve weak_ptr'nin yaşam süresini etkilemeden nasıl gözlemleyebildiğini göreceksin.
Kodunu düzenlemek için iki dosya oluşturacaksın:
Document.h: Paylaşılabilir bir belgeyi temsil eden birDocumentsınıfı tanımla. Şunlara sahip olmalı:- Özel bir
titleözniteliği (string) - Bir başlık alan ve
"Document created: <title>"yazdıran bir kurucu "Document deleted: <title>"yazdıran bir yıkıcı- Başlığı döndüren bir
getTitle()yöntemi
- Özel bir
main.cpp: Girdiden bir belge başlığı okuyarak üç akıllı işaretçi türünün tümünü göster, ardından:- Girdi başlığına sahip bir Document için bir
unique_ptroluştur "Unique owner: <title>"yazdırunique_ptrkullanarak sahipliği başka birstd::move'ye aktar"Ownership transferred"yazdırshared_ptrbaşlığına sahip yeni bir Document için bir"SharedDoc"oluştur- Aynı belgeyi gösteren ikinci bir
shared_ptroluştur "Shared owners: <count>"kullanarakuse_count()yazdır- Paylaşılan işaretçilerden birinden bir
weak_ptroluştur - Belgeye zayıf işaretçi üzerinden erişmek için
lock()kullan ve"Weak access: <title>"yazdır
- Girdi başlığına sahip bir Document için bir
Akıllı işaretçiler için <memory> eklemeyi unutma. Akıllı işaretçilerini oluşturmak için std::make_unique ve std::make_shared kullan. Yıkıcı mesajları, her belgenin programın sonunda ne zaman otomatik olarak temizlendiğini görmene yardımcı olacak.
Başlık dosyanı main.cpp içine #include "Document.h" kullanarak ekle.
Kendin dene
#include <iostream>
#include <memory>
#include <string>
#include "Document.h"
using namespace std;
int main() {
string inputTitle;
cin >> inputTitle;
// TODO: inputTitle ile bir Document için unique_ptr oluşturun
// std::make_unique kullanarak
// TODO: "Unique owner: <title>" yazdırın
// TODO: std::move kullanarak sahipliği başka bir unique_ptr nesnesine devredin
// TODO: "Ownership transferred" yazdırın
// TODO: "SharedDoc" başlıklı yeni bir Document için shared_ptr oluşturun
// std::make_shared kullanarak
// TODO: Aynı belgeyi işaret eden ikinci bir shared_ptr oluşturun
// TODO: use_count() kullanarak "Shared owners: <count>" yazdırın
// TODO: Paylaşılan işaretçilerden birinden bir weak_ptr oluşturun
// TODO: weak_ptr üzerinden belgeye erişmek için lock() kullanın
// ve "Weak access: <title>" yazdırın
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi