Ö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 Üyeleri | Statik Üyeler |
|---|---|
| Her nesneye özgüdür | Tüm nesneler arasında paylaşılır |
| Nesne oluşturulduğunda oluşturulur | Herhangi bir nesne oluşturulmadan önce mevcuttur |
Nesne üzerinden erişilir: player.health | Sı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.
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 birProductsınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:- Örnek üyeler:
name(string) veprice(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>"
- Örnek üyeler:
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
Productoluş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
Productoluşturun. Bilgilerini ve envanter istatistiklerini yazdırın. - Adı
"Bonus"ve fiyatı5.00olan üçüncü birProductoluşturun. Son envanter istatistiklerini yazdırın.
- Sınıf adını kullanarak başlangıç 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 Üyeler | Statik Üyeler |
|---|---|
| Her nesneye özgü | Tüm nesneler arasında paylaşılır |
| Nesne oluşturulduğunda oluşturulur | Herhangi bir nesne oluşturulmadan önce mevcuttur |
Nesne üzerinden erişilir: player.health | Sı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;
}
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 Konteyner