Örnek ve Statik Üyeler
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 104.
Şimdiye kadar oluşturduğun her üye değişken belirli bir nesneye aitti. İki Player nesnesi oluşturduğunda, her birinin kendine ait bir name ve health değeri olur. Bunlara örnek üyeleri denir - sınıfın her örneği için ayrı ayrı var olurlar.
Peki ya tüm nesneler arasında paylaşılan verilere ihtiyacın varsa? Örneğin, toplamda kaç oyuncunun bulunduğunu takip etmek.
statik üyeler işte burada devreye girer. Statik bir üye, belirli bir nesneye değil, sınıfın kendisine aittir.
class Player {
std::string name; // Örnek üye - her oyuncunun kendine ait
int health; // Örnek üye
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 şudur: örnek üyelerine bir nesne üzerinden erişilirken statik üyelere doğrudan sınıf adı üzerinden erişilebilir. Örnek üyelerini “nesne başına bir tane”, statik üyeleri ise “sınıf başına bir tane” olarak düşünebilirsin.
| Örnek Üyeleri | 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 var olur |
Nesne üzerinden erişilir: player.health | Sınıf üzerinden erişilir: Player::playerCount |
Statik üyeler sayaçlar, yapılandırma değerleri veya tek tek nesnelerden ziyade mantıksal olarak sınıfa ait olan herhangi bir veri için kullanışlıdır.
Görev
KolayHem tek tek ürün ayrıntılarını hem de genel envanter istatistiklerini örnek ve statik üyeleri kullanarak izleyen bir ürün envanter sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
Product.h: Tek tek ürünleri yönetirken aynı zamanda envanter genelindeki verileri de izleyen birProductsınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:- Örnek üyeleri:
name(string) veprice(double): her ürüne özgü - Mevcut ürünlerin kaç tane olduğunu sayan statik bir
totalProductsüyesi - Tüm ürünlerin toplam fiyatını izleyen statik bir
totalValueüyesi - Bir ad ve fiyat alan, örnek üyelerini başlatan ve her iki statik sayacı güncelleyen bir kurucu (sayacı artırır, fiyatı toplam değere ekler)
- Bir ürün kaldırıldığında statik sayaçları güncelleyen bir yıkıcı (sayacı azaltır, fiyatı toplam değerden çıkarır)
- Şu biçimde bir dize döndüren bir
getInfo()yöntemi:"<name>: $<price>" - Şu dizeyi döndüren statik bir
getInventoryStats()yöntemi:"Products: <count>, Total Value: $<value>"
- Örnek üyeleri:
main.cpp: Statik üyelerin tüm nesneler arasında nasıl paylaşıldığını, örnek üyelerin ise nasıl benzersiz kaldığını gösterin. Girdiden iki ürün adı ve bunların 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 bloğu oluşturun ve bu bloğun içinde ilk ad ve fiyatla bir
Productoluşturun. Bilgilerini ve güncel envanter istatistiklerini yazdırın. - Blok sona erdikten sonra (ilk ürün yok edildikten sonra), envanter istatistiklerinin ardından
"After first scope:"ifadesini yazdırın - İkinci ad ve fiyatla başka bir
Productoluşturun. Bilgilerini ve envanter istatistiklerini yazdırın. Productadı ve"Bonus"fiyatıyla üçüncü bir5.00oluşturun. Nihai envanter istatistiklerini yazdırın.
- Sınıf adını kullanarak başlangıç envanter istatistiklerini yazdırın:
Statik üyeleri sınıfın dışında, başlık dosyasında (sınıf tanımından sonra) tanımlamayı unutmayın. Fiyatları, std::fixed içindeki std::setprecision(2) ve <iomanip> kullanarak iki ondalık basamakla biçimlendirin.
Başlık dosyanızı #include "Product.h" kullanarak main.cpp dosyasına ekleyin.
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 bloğu oluştur
// Bloğun içinde:
// - name1 ve price1 ile bir Product oluştur
// - getInfo() kullanarak bilgilerini yazdır
// - Mevcut envanter istatistiklerini yazdır
// TODO: After the block ends, print "After first scope:"
// Ardından envanter istatistiklerini yazdır
// TODO: name2 ve price2 ile başka bir Product oluştur
// Bilgilerini ve envanter istatistiklerini yazdır
// TODO: "Bonus" adında ve 5.00 fiyatında üçüncü bir Product oluştur
// Son envanter istatistiklerini yazdır
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 KonteynerKendi başına pratik yap: Online C++ derleyicisi