Menu
Coddy logo textTech

Statik Metotlar ve Değişkenler

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 31 / 104.

Statik üyelerin tüm nesneler arasında paylaşıldığını öğrendiniz. Şimdi statik değişkenlerin yanı sıra statik metotların nasıl düzgün bir şekilde tanımlanacağını ve kullanılacağını keşfedelim.

Bir sınıf içinde bildirilen statik değişkenler, genellikle bir kaynak dosyasında olmak üzere sınıfın dışında tanımlanmalıdır. Bunun nedeni, statik üyelerin tüm nesneler tarafından paylaşılan tam olarak bir depolama konumuna ihtiyaç duymasıdır:

class Counter {
    static int count;    // Sadece bildirim
    
public:
    Counter() { count++; }
    ~Counter() { count--; }
    
    static int getCount() {    // Statik metot
        return count;
    }
};

// Tanımlama - sınıf dışında gereklidir
int Counter::count = 0;

Bir statik metot herhangi bir nesneye değil, sınıfa aittir. Bunun önemli bir sonucu vardır: statik metotlar, belirli bir nesne üzerinde çağrılmadıkları için örnek üyelerine erişemezler veya this işaretçisini kullanamazlar.

class MathUtils {
    static double pi;
    
public:
    static double circleArea(double radius) {
        return pi * radius * radius;    // Statik üyelere erişebilir
    }
};

double MathUtils::pi = 3.14159;

// Bir nesne olmadan çağrılır
double area = MathUtils::circleArea(5.0);

Statik metotlar; nesne durumuna ihtiyaç duymayan yardımcı fonksiyonlar, nesne oluşturan fabrika metotları veya statik verilere erişmek için idealdir. Bir nesne örneği gerektirmedikleri için, onları sınıf adını ve kapsam çözümleme operatörünü kullanarak çağırırsınız: ClassName::methodName().

challenge icon

Görev

Kolay

Nesne örneklerine ihtiyaç duymadan sınıf düzeyinde işlevsellik sağlamak için statik metotların ve değişkenlerin nasıl birlikte çalıştığını gösteren benzersiz bir ID oluşturucu sistemi kuralım.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • IDGenerator.h: Sıralı benzersiz ID'ler oluşturan bir IDGenerator sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Atanacak bir sonraki ID'yi takip eden özel bir statik üye nextId (1000 değerinden başlar)
    • Tüm ID'ler için özelleştirilebilir bir önek saklayan özel bir statik üye prefix (string)
    • Öneki değiştiren statik bir metot setPrefix(const std::string& p)
    • Önek ile mevcut ID numarasını birleştiren bir string döndüren ve ardından bir sonraki çağrı için nextId değerini artıran statik bir metot getNextId()
    • Sayacı artırmadan bir sonraki ID'nin ne olacağını döndüren statik bir metot peekNextId()
    • Kaç tane ID oluşturulduğunu döndüren statik bir metot getGeneratedCount() (ipucu: başlangıç değeri ve mevcut nextId üzerinden hesaplayın)
    • nextId değerini tekrar 1000 değerine sıfırlayan statik bir metot reset()

    Statik üyelerinizi sınıf tanımından sonra sınıfın dışında tanımlamayı unutmayın. prefix üyesini "ID-" olarak başlatın.

  • main.cpp: Herhangi bir nesne oluşturmadan sınıf adını kullanarak statik metotları çağırmayı gösterin. Girişten özel bir önek okuyun, ardından:
    • peekNextId() kullanarak "Peek: <peeked_id>" yazdırın
    • getNextId() kullanarak üç ID oluşturun ve her birini "Generated: <id>" olarak yazdırın
    • Kaç ID oluşturulduğunu gösteren "Count: <count>" yazdırın
    • setPrefix() ile giriş değerini kullanarak öneki değiştirin
    • İki ID daha oluşturun ve her birini "Generated: <id>" olarak yazdırın
    • Tekrar "Count: <count>" yazdırın
    • reset() metodunu çağırın
    • "After reset - Peek: <peeked_id>" yazdırın
    • "After reset - Count: <count>" yazdırın

Hiçbir zaman bir IDGenerator nesnesi oluşturmadığınıza dikkat edin — tüm metotlar IDGenerator::methodName() kullanılarak doğrudan sınıf üzerinden çağrılır. Bu, statik metotların temel özelliğidir: herhangi bir örneğe değil, sınıfın kendisine aittirler.

Başlık dosyanıza <string> ve <iostream> kütüphanelerini dahil edin ve başlık korumalarını (header guards) unutmayın.

Kendin dene

#include <iostream>
#include <string>
#include "IDGenerator.h"

using namespace std;

int main() {
    // Girişten özel öneki oku
    string customPrefix;
    cin >> customPrefix;
    
    // TODO: peekNextId() kullanarak "Peek: <peeked_id>" yazdır
    
    // TODO: getNextId() kullanarak üç ID oluştur ve her birini "Generated: <id>" olarak yazdır
    
    // TODO: Kaç tane ID oluşturulduğunu gösteren "Count: <count>" ifadesini yazdır
    
    // TODO: setPrefix() ile giriş değerini kullanarak öneki değiştir
    
    // TODO: İki ID daha oluştur ve her birini "Generated: <id>" olarak yazdır
    
    // TODO: "Count: <count>" ifadesini tekrar yazdır
    
    // TODO: reset() fonksiyonunu çağır
    
    // TODO: "After reset - Peek: <peeked_id>" yazdır
    
    // TODO: "After reset - Count: <count>" yazdır
    
    return 0;
}
quiz iconKendini test et

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