SABİT NESNE VE ELEMAN FONKSİYONLAR VE ELEMAN NESNELER Yılmaz Kılıçaslan
Sunum Planı Bu derste sınıf mekanizmasını şu unsurlarını inceleyeceğiz: const nesneler ve eleman fonksiyonlar Eleman nesneler
const NESNELER VE ELEMAN FONKSİYONLAR - 1 Değişkenleri olduğu gibi nesneleri de const olarak bildirebilirsiniz: const Tarih dogum1( 7, 4, 1776 ); Bu tür bildirimler nesnenin sabit olduğu ve dolayısıyla hiçbir eleman sahasının değiştirilemeyeceği anlamına gelir. Bir değişkeni const olarak bildirdiğinizde, derleyici bu değişkenin değerini değiştirebilecek işlemleri tespit edip uygun hata mesajlarını üretebilir. Ancak, derleyici bir eleman fonksiyonun nesnenin eleman sahalarını değiştirip değiştiremeyeceğini belirleyemez. Bu nedenle, hiçbir (sıradan) eleman fonksiyon sabit bir nesne için çağrılamaz.
const NESNELER VE ELEMAN FONKSİYONLAR - 2 Eğer bir eleman fonksiyon nesnenin hiçbir eleman sahasını değiştirmiyorsa const olarak bildirilebilir ve bu şekilde sabit nesneler için çağrılabilir. const anahtar sözcüğü sabit fonksiyonların hem bildiriminde hem de tanımlanmasında, parametre listesinden sonra, yer alır. Sabit eleman fonksiyonlar ne nesnelerinin eleman sahalarını değiştirebilir, ne de sabit olmayan eleman fonksiyonları çağırabilirler. Eleman fonksiyonlarınızı mümkün olduğunca sabit olarak bildirmelisiniz. Bu, sınıfınızı kullananların sabit nesneler bildirmelerine izin verecektir.
const NESNELER VE ELEMAN FONKSİYONLAR - 3 class Tarih { public: Tarih( int mn, int dy, int yr ); int aySoyle() const; int gunSoyle() const; int yilSoyle() const; int ayBelirle( int mn ); int gunBelirle ( int dy ); int yilBelirle( int yr ); void goruntule() const; ~Tarih(); private: int ay, gun, yil; }; inline int Tarih::aySoyle() const { return ay; } // ... int i; const Tarih dogum1( 7, 4, 1776 ); i = dogum1.yilSoyle(); // Legal dogum1.yilBelirle( 1492 ); // Error
ELEMAN NESNELER - 1 Bir sınıf, nesneleri eleman olarak içerebilir. Bu şekilde diğer sınıfları bileşen olarak kullanma suretiyle yeni bir sınıf tanımlama işlemine “composition” denir: class KisiBilgisi { public: // Public eleman fonksiyonlar... private: char isim[30]; char adres[60]; Tarih dogumTarihi; }; dogumTarihi nesnesinin hiç argüman almaması doğrudan varsayılan yapıcı fonksiyonun çağrılacağı anlamına gelmez. dogumTarihi nesnesi KisiBilgisi sınıfından bir nesne yaratılıncaya kadar yaratılmaz.
ELEMAN NESNELER - 2 class KisiBilgisi Bir eleman nesne için yapıcı fonksiyon çağrımı, eleman nesneye ilk değer atamalarının yapılmasını gerektirir. Bunun icin yapılması gereken aşağıda örneklenmiştir: class KisiBilgisi { public: KisiBilgisi(char *nm, char *adr, int mn, int dy, int yr); // ... private: };
ELEMAN NESNELER - 3 KisiBilgisi::KisiBilgisi(char *nm, char *adr, int mn, int dy, int yr) :dogumTarihi( mn, dy, yr ) { strncpy( name, nm, 30 ); strncpy( adres, adr, 60 ); } İlk once Tarih sınıfının yapıcı fonksiyonu çağrılır; böylelikle dogumTarihi nesnesi ilk değerlerini KisiBilgisi sınıfının yapıcı fonksiyonu çalıştırılmadan alır.
Örnek #include <iostream> using namespace std; #define SIZE 100 // Stack sınıfı: class stack { int stack[SIZE]; int tos; public: stack(); // constructor ~stack(); // destructor void push(int i); int pop(); };
. . . // Yapici Fonksiyon stack::stack() { tos = 0; cout << "Stack Initialized\n"; } // Yikici Fonksiyon stack::~stack() cout << "Stack Destroyed\n";
. . . void stack::push(int i) { if(tos==SIZE) { cout << "Stack is full.\n"; return; } stck[tos] = i; tos++;
. . . int stack::pop() { if(tos==0) { cout << "Stack underflow.\n"; return 0; } tos--; return stck[tos];
. . . int main() { stack a, b; // iki stack nesnesi yaratildi a.push(1); b.push(2); a.push(3); b.push(4); cout << a.pop() << " "; cout << b.pop() << " "; cout << b.pop() << "\n"; return 0; }
. . . Program Çıktısı: Stack Initialized 3 1 4 2 Stack Destroyed
ÖZET Sabit nesnelerin eleman sahalarının değeri değiştirilemez ve bu sahalara yalnızca sabit oldukları bildirilmiş eleman fonksiyonlarla erişilir. Eleman nesnelerin yapıcı fonksiyonları, elemanı oldukları nesnenin yapıcı fonksiyonunun çağrılmasından hemen önce çağrılır.
Kaynaklar Booch, G. 1998. Object-Oriented Analysis and Design. Addison-Wesley. Programmer’s Guides, Microsoft Visual C++. Wegner, P. 1976. IEEE Transactions on Computers, December, 1207-1225.