Menu
Coddy logo textTech

Örnek ve Statik Üyeler

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

Şu ana kadar oluşturduğunuz her üye değişkeni belirli bir nesneye aittir. İki Player nesnesi oluşturduğunuzda, her birinin kendi name ve health değişkeni olur. Bunlara örnek üyeleri (instance members) denir; sınıfın her örneği için ayrı ayrı bulunurlar.

Peki ya tüm nesneler arasında paylaşılan verilere ihtiyacınız varsa? Örneğin, toplamda kaç oyuncunun var olduğunu takip etmek gibi.

İşte burada statik üyeler devreye girer. Statik bir üye, herhangi bir nesneye değil, sınıfın kendisine aittir.

class Player {
    std::string name;           // Örnek üyesi - her oyuncunun kendine ait bir adı vardır
    int health;                 // Örnek üyesi
    
    static int playerCount;     // Statik üye - TÜM oyuncular tarafından paylaşılır
    
public:
    Player(std::string n) : name(n), health(100) {
        playerCount++;          // Herhangi bir oyuncu oluşturulduğunda artır
    }
    
    ~Player() {
        playerCount--;          // Herhangi bir oyuncu yok edildiğinde azalt
    }
};

Temel fark: instance üyelerine bir nesne üzerinden erişilirken, statik üyelere sınıf isminin kendisi üzerinden erişilebilir. Instance üyelerini "nesne başına bir tane" ve statik üyeleri "sınıf başına bir tane" olarak düşünün.

Örnek ÜyeleriStatik Üyeler
Her nesneye özgüdürTüm nesneler arasında paylaşılır
Nesne oluşturulduğunda oluşturulurHerhangi bir nesne oluşturulmadan önce mevcuttur
Nesne üzerinden erişilir: player.healthSınıf üzerinden erişilir: Player::playerCount

Statik üyeler; sayaçlar, yapılandırma değerleri veya mantıksal olarak bireysel nesnelerden ziyade sınıfa ait olan herhangi bir veri için yararlıdır.

challenge icon

Görev

Kolay

Örnek (instance) ve statik üyeleri kullanarak hem bireysel ürün ayrıntılarını hem de genel envanter istatistiklerini takip eden bir ürün envanter sistemi oluşturalım.

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

  • Product.h: Envanter genelindeki verileri takip ederken aynı zamanda bireysel ürünleri yöneten bir Product sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Örnek üyeler: name (string) ve price (double) — her ürüne özgü
    • Şu anda kaç ürünün mevcut olduğunu sayan statik bir üye: totalProducts
    • Tüm ürünlerin toplam fiyatını takip eden statik bir üye: totalValue
    • Bir isim ve fiyat alan, örnek üyeleri başlatan ve her iki statik sayacı da güncelleyen (sayıyı artırır, fiyatı toplam değere ekler) bir yapıcı (constructor)
    • Bir ürün kaldırıldığında statik sayaçları güncelleyen (sayıyı azaltır, fiyatı toplam değerden çıkarır) bir yıkıcı (destructor)
    • Şu formatta bir string döndüren getInfo() metodu: "<name>: "<name>: $<price>"lt;price>"
    • Şu string'i döndüren statik bir metot getInventoryStats(): "Products: <count>, Total Value: "Products: <count>, Total Value: $<value>"lt;value>"
  • main.cpp: Örnek üyeler benzersiz kalırken statik üyelerin tüm nesneler arasında nasıl paylaşıldığını gösterin. Girdiden iki ürün adı ve fiyatlarını okuyun (name1, price1, name2, price2 — her biri ayrı bir satırda), ardından:
    • Sınıf adını kullanarak başlangıç envanter istatistiklerini yazdırın: Product::getInventoryStats()
    • Süslü parantezlerle bir kapsam (scope) bloğu oluşturun ve içinde ilk isim ve fiyatla bir Product oluşturun. Bilgilerini ve mevcut envanter istatistiklerini yazdırın.
    • Blok sona erdikten sonra (ilk ürün yok edildikten sonra), "After first scope:" yazdırın ve ardından envanter istatistiklerini yazdırın.
    • İkinci isim ve fiyatla başka bir Product oluşturun. Bilgilerini ve envanter istatistiklerini yazdırın.
    • Adı "Bonus" ve fiyatı 5.00 olan üçüncü bir Product oluşturun. Son envanter istatistiklerini yazdırın.

Statik üyelerinizi başlık dosyasında sınıfın dışında (sınıf tanımından sonra) tanımlamayı unutmayın. Fiyatları, <iomanip> kütüphanesinden std::fixed ve std::setprecision(2) kullanarak iki ondalık basamakla biçimlendirin.

Başlık dosyanızı main.cpp içine #include "Product.h" kullanarak dahil edin.

Kopya kağıdı

C++ iki tür sınıf üyesini destekler: örnek üyeler (instance members) ve statik üyeler (static members).

Örnek üyeler her nesneye özgüdür - her örneğin kendi kopyası vardır:

class Player {
    std::string name;  // Her oyuncunun kendi adı vardır
    int health;        // Her oyuncunun kendi canı vardır
};

Statik üyeler bir sınıfın tüm nesneleri arasında paylaşılır - sınıfın kendisine ait olan tek bir kopya vardır:

class Player {
    static int playerCount;  // TÜM oyuncular tarafından paylaşılır
    
public:
    Player(std::string n) : name(n), health(100) {
        playerCount++;  // Paylaşılan sayacı artır
    }
    
    ~Player() {
        playerCount--;  // Yok edildiğinde azalt
    }
};

Temel farklar:

Örnek ÜyelerStatik Üyeler
Her nesneye özgüTüm nesneler arasında paylaşılır
Nesne oluşturulduğunda oluşturulurHerhangi bir nesne oluşturulmadan önce mevcuttur
Nesne üzerinden erişilir: player.healthSınıf üzerinden erişilir: Player::playerCount

Statik metotlar sınıf adı kullanılarak çağrılabilir ve yalnızca statik üyelere erişebilir:

class Player {
    static int playerCount;
    
public:
    static int getPlayerCount() {
        return playerCount;  // Yalnızca statik üyelere erişebilir
    }
};

// Sınıf adını kullanarak çağır
int count = Player::getPlayerCount();

Statik üyeler sınıfın dışında tanımlanmalıdır (genellikle bir .cpp dosyasında veya bir başlıktaki sınıf tanımından sonra):

int Player::playerCount = 0;

Statik üyeler; sayaçlar, paylaşılan yapılandırma değerleri veya mantıksal olarak bireysel nesnelerden ziyade sınıfa ait olan herhangi bir veri için kullanışlıdır.

Kendin dene

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

using namespace std;

int main() {
    // Girdiyi oku
    string name1;
    double price1;
    string name2;
    double price2;
    
    getline(cin, name1);
    cin >> price1;
    cin.ignore();
    getline(cin, name2);
    cin >> price2;
    
    // TODO: Product::getInventoryStats() kullanarak başlangıç envanter istatistiklerini yazdır
    
    // TODO: Süslü parantezlerle bir kapsam (scope) bloğu oluşturun
    // Bloğun içinde:
    //   - name1 ve price1 ile bir Product oluşturun
    //   - getInfo() kullanarak bilgilerini yazdırın
    //   - Mevcut envanter istatistiklerini yazdırın
    
    // TODO: Blok sona erdikten sonra "After first scope:" yazdırın
    // Ardından envanter istatistiklerini yazdırın
    
    // TODO: name2 ve price2 ile başka bir Product oluşturun
    // Bilgilerini ve envanter istatistiklerini yazdırın
    
    // TODO: "Bonus" isimli ve 5.00 fiyatlı üçüncü bir Product oluşturun
    // Son envanter istatistiklerini yazdırın
    
    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