Özet - String Sınıfı
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 26 / 104.
Görev
KolayBu bölümdeki tüm kurucu (constructor) ve yıkıcı (destructor) kavramlarını bir araya getiren, kendi dinamik karakter dizisini yöneten eksiksiz bir String sınıfı oluşturalım. Bu, std::string yapısının dahili olarak nasıl çalıştığını yansıtan klasik bir alıştırmadır.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
String.h: Beşli Kuralı'nı (Rule of Five) takip ederekStringsınıfınızı tanımlayın. Sınıfınızdataadında birchar*işaretçisi ve birsize_t lengthüyesini yönetmelidir. Şunları uygulayın:- Boş bir dize oluşturan bir varsayılan kurucu (default constructor) (null sonlandırıcı için tek bir karakter ayırın, uzunluğu 0 olarak ayarlayın).
"Default constructed"yazdırın. - C-string'i yeni ayrılmış belleğe kopyalayan,
const char*alan bir parametreli kurucu (parameterized constructor)."Constructed: <text>"yazdırın. - Başka bir String'in derin kopyasını (deep copy) gerçekleştiren bir kopya kurucu (copy constructor).
"Copied: <text>"yazdırın. - Sahipliği devreden (
noexceptolarak işaretlenmiş) bir taşıma kurucusu (move constructor). Kaynağı sıfırlamadan önceki metni kullanarak"Moved: <text>"yazdırın. - Belleği güvenli bir şekilde serbest bırakan (null kontrolü yapın) bir yıkıcı (destructor).
"Destroyed: <text>"yazdırın (eğer veri null ise veya uzunluk 0 ise"Destroyed: (empty)"yazdırın). - Uzunluğu döndüren bir
size()metodu. - Karakter işaretçisini döndüren bir
c_str()metodu (null ise""döndürün).
- Boş bir dize oluşturan bir varsayılan kurucu (default constructor) (null sonlandırıcı için tek bir karakter ayırın, uzunluğu 0 olarak ayarlayın).
main.cpp: Tüm kurucuların birlikte çalışmasını gösterin. Girişten bir metin dizesi okuyun, ardından:- Varsayılan kurucuyu kullanarak
s1adında birStringoluşturun. - Giriş metniyle
s2adında birStringoluşturun. s2'yi kopyalayaraks3adında birStringoluşturun.s2'den taşıyaraks4adında birStringoluşturun."--- Status ---"yazdırın.- Her bir dize için (s1'den s4'e kadar),
"s<n>: \"<text>\" (length: <len>)"yazdırın.
- Varsayılan kurucuyu kullanarak
Verimlilik için tüm kurucularda başlatıcı listeleri (initializer lists) kullanın. Taşıma işleminden sonra s2, 0 uzunluğuyla boş olmalı, s4 ise orijinal metni tutmalıdır. Sondaki yıkıcı mesajları, dört nesnenin de oluşturulma sırasının tersine temizlendiğini gösterecektir.
strlen ve strcpy için <cstring>, std::move() için <utility> kütüphanelerini dahil edin. Başlık dosyanızda başlık koruyucularını (header guards) unutmayın.
Kendin dene
#include <iostream>
#include <string>
#include "String.h"
using namespace std;
int main() {
string input;
getline(cin, input);
// TODO: Varsayılan kurucu kullanarak String s1 oluşturun
// TODO: Giriş metni ile String s2 oluşturun
// TODO: s2'yi kopyalayarak String s3 oluşturun
// TODO: s2'den taşıyarak String s4 oluşturun (std::move kullanın)
// Durum başlığını yazdırın
cout << "--- Status ---" << endl;
// TODO: s1'den s4'e kadar her bir string için durumu yazdırın
// Format: "s<n>: \"<text>\" (length: <len>)"
return 0;
}
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 Konteyner