Menu
Coddy logo textTech

Ö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.

challenge icon

Görev

Kolay

Bu 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 ederek String sınıfınızı tanımlayın. Sınıfınız data adında bir char* işaretçisi ve bir size_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 (noexcept olarak 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).
  • main.cpp: Tüm kurucuların birlikte çalışmasını gösterin. Girişten bir metin dizesi okuyun, ardından:
    • Varsayılan kurucuyu kullanarak s1 adında bir String oluşturun.
    • Giriş metniyle s2 adında bir String oluşturun.
    • s2'yi kopyalayarak s3 adında bir String oluşturun.
    • s2'den taşıyarak s4 adında bir String oluşturun.
    • "--- Status ---" yazdırın.
    • Her bir dize için (s1'den s4'e kadar), "s<n>: \"<text>\" (length: <len>)" yazdırın.

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