NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

Slides:



Advertisements
Benzer bir sunumlar
NESNEYE YÖNELİK PROGRAMLAMA Temel Kavramlar
Advertisements

C# - Metotlar.
Nesnelerin Özellikleri. - Üye nesneler - friend belirtesi - Nesnelerin operatörlere yüklenmesi - this yerel (lokal) değişkeni - inline tanımlı üye fonksiyonlar.
SINIFLAR Yılmaz Kılıçaslan.
NESNEYE YÖNELİK PROGRAMLAMA KALITIM
Nesneye Dayalı Programlama
Zamanı Ölçme Yıl Ay Hafta Gün
Nesneye Dayalı Programlama
C++’A GİRİŞ Yılmaz Kılıçaslan.
Elektrik-Elektronik Mühendisliği Bölümü DİZİLER C Programlama Dili Yaz Stajı Cengiz TEPE SAMSUN 2007.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
SANAL FONKSİYONLAR VE ÇOK BİÇİMLİLİK
Bölüm 9 Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri
String Kütüphanesindeki Arama Fonksiyonları
Bölüm 10 Yapılar ve Birleşimler
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 6: Sınıflar
KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR, NESNE DİZİLERİ Yılmaz Kılıçaslan.
SINIFLAR GİRİŞ Yılmaz Kılıçaslan.
Matematik 1 Takvim Nedir?.
Nesneye Dayalı Programlama
2 dakikada hep beraber tus birikimi yapalım
DELEGATE OOP-UYG.
Erişim Denetimi, Fonksiyon
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 5: Fonksiyonlar
KALITIM Yılmaz Kılıçaslan.
Dünya hep dönüyor.
ZAMANI ÖĞRENELİM.
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ
Nesneye Dayalı Programlama
Metotlar.
SABİT NESNE VE ELEMAN FONKSİYONLAR VE ELEMAN NESNELER
Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü C ++ Nesne.
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
Kalıtım , Sınıf Asli Ergün.
Mevsim Şeridi
Demet AYDIN METODLAR Demet AYDIN
Fonksiyonlar Fonksiyon Tanımı
Nesneye Dayalı Programlama
C++’a Giriş Yılmaz Kılıçaslan.
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ VE SINIFLARIN DİĞER ÖZELLİKLERİ Yılmaz Kılıçaslan.
KALITIM Yılmaz Kılıçaslan.
SANAL FONKSİYONLAR VE ÇOKBİÇİMLİLİK Yılmaz Kılıçaslan.
C++ Ders Notları 2.Ders (Dilin Yapısı)
Bölüm 6 Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
C++.
Bil 102 Bölüm 3 Java’da Program Akış Denetimi Bil 1021.
SINIFLAR GİRİŞ Yılmaz Kılıçaslan. Sunum Planı  Bu derste sınıf mekanizmasını şu yönleriyle inceleyeceğiz: –Sınıf kavramının evrimine kısa bir bakış –Bir.
2010 TAKVİMİ İYİ SENELER.
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ Yılmaz Kılıçaslan.
SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
ZAMANI ÖĞRENELİM.
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
Veri yapıları Hafta3 Dizi Yapıları.
BİLGİSAYAR programlama II
Bilgisayar Programlama III C
Hafta2 Rekürsif Algoritmalar
Örnek Sorular Bilgisayar Programlama BIL 107. Soru 1: Ekran çıktısında 66 yazması için boşlukları doldurunuz ______ i = 'A'; printf(____, i__); CEVAP:
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
Uzun vadeli kredilerin döviz kompozisyonu
Uzun vadeli kredilerin döviz kompozisyonu
DİZİLER Bellekte sıralı bir şekilde bulunan ve aynı türden bilgilerin saklandığı veri yapısına dizi (array) denir. Örneğin kullanıcıdan 7 kişinin not ortalamasını.
2010 Aylık Takvim Bu şablonu, duvar takvimi olarak kullanmak için yazdırabilir veya kendi sununuza eklemek için herhangi bir ayın sayfasını kopyalayabilirsiniz.
2010 TAKVİMİ İYİ SENELER.
YAPISAL PROGRAMLAMA Hafta-6
YAPISAL PROGRAMLAMA Hafta-7
Karakter dizi fonksiyonları
Ocak 2010 PAZARTESİ SALI ÇARŞAMBA PERŞEMBE CUMA CUMARTESİ PAZAR 1 2 3
NİŞANTAŞI ÜNİVERSİTESİ
Sunum transkripti:

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR Özlem AYDIN Trakya Üniversitesi Bilgisayar Mühendisliği Bölümü Not: Bu sunumda Doç. Dr. Yılmaz KILIÇASLAN’ın Nesneye Yönelik Programlama dersi sunumlarından faydalanılmıştır.

SINIF VE NESNE KAVRAMLARI Sınıf, aynı özellik ve davranışları gösteren varlıkların ortak kümesini belirleyen bir tanımdır. Nesne, ait olduğu sınıftan gelen özelliklerin değerlerinin belli olduğu, sınıfı için tanımlı olan davranışları nasıl sergilediğinin bilindiği somut varlıktır.

SINIFLAR Sınıflar, nesneye yönelik programlama yaklaşımını uygulamada gerekli olan C’deki yapılara (structures) benzeyen C++’a özgü veri yapılarıdır.

YAPILAR - 1 Yapı, farklı veri tiplerini bir küme altında toplayan bir veri tipidir. Eğer tarihler üzerine çok sık işlem yapan bir C programı yazıyorsanız, tarihleri gösteren yeni bir veri tipini yapı (structure) olarak tanımlayabilirsiniz: struct tarih { int ay; int gun; int yil; }; //... struct tarih dogum; dogum.ay = 1; dogum.gun = 23; dogum.yil = 1985;

YAPILAR - 2 printf’e parametre olarak geçirmek suretiyle bir tarih yapısını yazdıramazsınız. Ya yapının her elemanını ayrı ayrı yazdırmalısınız ya da yapıyı bir bütün olarak yazdırmak için kendi fonksiyonunuzu yazmalısınız: void tarih_goruntule(struct tarih *tr) { static char *isim[] = {“zero”,”ocak”,”subat”,”mart”,”nisan”,“mayis”, ”haziran”,”temmuz”,”agustos”,“eylul”,”ekim”, ”kasim”,”aralik”}; printf(“%s %d %d”,isim[tr->ay],tr->gun,tr->yil);}

YAPILAR - 3 Tarihler üzerinde, iki tanesini karşılaştırmak gibi, benzer işlemler yapmak için de, ya yapı elemanlarını ayrı ayrı işlemelisiniz ya da tarih yapılarını parametre olarak kabul edip söz konusu işlemleri sizin için yapan fonksiyonlar tanımlamalısınız.

YAPILAR - 4 Tarihleri yapı olarak göstermenin çeşitli dezavantajları vardır: Bir tarih yapısının geçerli bir tarihi içerdiği garanti edilemez. Bir kez tarih veri tipini programlarınızda kullandığınızda, kodlaması üzerinde değişiklik yapmak çok zorlaşır.

YAPILAR - 5 Bu problemlerden kaçınmak için daha fazla programlama eforu göstermelisiniz. Örneğin, belirtilen değerlerin geçerliliğini test eden bir fonksiyon kullanabilirsiniz ve yapının eleman sahalarına doğrudan erişmek yerine, erişim fonksiyonları tanımlayabilirsiniz.

Özellikler (attributes) SINIF BİLDİRİMİ - 1 C++, tanımladığınız yeni veri tiplerinin güvenliğini, bir veri tipi ve bu veri tipi üzerindeki işlemleri aynı anda tanımlamanıza imkan veren sınıflar aracılığıyla sağlar. Tarih ay gün yıl goruntule Sınıf ismi (class name) Özellikler (attributes) Metotlar (methods)

SINIF BİLDİRİMİ - 2 Bir sınıf bildirimi, yalnızca verileri değil eleman fonksiyonları da içermesi haricinde, yapı bildirimine benzer: class sınıf_ismi{ özel korumalı veri ve fonksiyonlar erişim_etiketi: veri ve fonksiyonlar // ... } nesne_listesi;

SINIF BİLDİRİMİ - 3 Örnek: // Tarih sinifi #include <iostream> using namespace std; class Tarih { public: Tarih( int mn, int dy, int yr ); void goruntule(); ~Tarih(); private: int ay, gun, yil; };

FONKSİYONLARIN TANIMLANMASI - 1 // Bazı gerekli fonksiyonlar inline int max( int a, int b ) { if ( a > b ) return a; return b; } inline int min( int a, int b ) if ( a < b ) return a;

FONKSİYONLARIN TANIMLANMASI - 2 // Yapici Fonksiyon Tarih::Tarih( int mn, int dy, int yr ) { static int uzunluk[] = {0,31,28,31,30,31,30,31,31,30 31,30,31}; //366 gun iceren yillari ihmal ediyoruz. ay = max( 1, mn ); ay = min( ay, 12 ); gun = max( 1, dy ); gun = min( gun, uzunluk[ay] ); yil = max(1, yr ); }

FONKSİYONLARIN TANIMLANMASI - 3 // Tarih Bilgisi Goruntuleme Fonksiyonu void Tarih::goruntule() { static char *isim[] = {“zero”,”ocak”,”subat”,”mart”,”nisan”,”mayis”, ”haziran”,”temmuz”,”agustos”,“eylul”,”ekim”,”kasim”, ”aralik” }; cout << isim[ay] << ‘,’ << gun << ‘,’ << yil; }

FONKSİYONLARIN TANIMLANMASI - 4 // Yikici Fonksiyon Tarih::~Tarih() { // Hicbir sey yapma }

SINIFLARIN KULLANIMI-1 // Tarih sinifinin kullanimina bir örnek int main() { // Gecerli bir Tarih bildirimi Tarih dogum1(3, 12, 1985); // Gecersiz bir Tarih bildirimi Tarih dogum2(23, 259, 1966); dogum1.goruntule(); cout << ‘\n’; dogum2.goruntule(); return 0; }

SINIFLARIN KULLANIMI-2 C’de tarihleri görüntülemek için her bir yapının adresini ilgili fonksiyona göndermeniz gerekecekti: // C’de tarihlerin goruntulenmesi goruntule(&dogum1); goruntule(&dogum2);

SINIFLARIN KULLANIMI-3 C++ her bir eleman fonksiyonu bir yapının eleman sahasına erişmekte kullanılan sözdizimine benzer bir sözdizim ile çağırır: dogum1.goruntule(); dogum2.goruntule(); C++’daki sözdizim bir veri tipi ile bu veri tipi üzerinde işlem yapacak fonksiyonlar arasındaki sıkı ilişkiyi vurgulamaktadır. Bu durum, sizin goruntule fonksiyonunu Tarih sınıfının bir parçasıymış gibi düşünmenize yol açar. Fakat, gerçekte bu birleşme yalnızca sözdizimseldir: Her Tarih nesnesi goruntule fonksiyonunun bir kopyasına sahip değildir; her nesne yalnızca kendi veri elemanlarını içerir.

SINIFIN ELEMANLARI Görüldüğü gibi, sınıf bildirimi (int tipinde ay, gun, yil sahaları gibi) veri elemanlarına sahip olması yönüyle yapı bildirimine benzemektedir. Fakat, bazı yönlerden de C’deki yapı bildiriminden ayrılmaktadır. Örneğin: public ve private anahtar sözcüklerini, (goruntule gibi) fonksiyon bildirimlerini ve (Tarih ve ~Tarih gibi) yapıcı ve yıkıcı olarak adlandırılan özel fonksiyonları içermektedir. Şimdi bu farklara ayrı ayrı bakalım.

ERİŞİM DÜZEYLERİ (public ve private)-1 public ve private etiketleri kendilerini takip eden elemanların erişilebilirlik düzeyini belirler. Belirlenen erişim düzeyi bir sonraki etikete ya da sınıf tanımının sonuna kadar devam eder. private elemanlara yalnızca eleman fonksiyonlar erişebilir. (Daha sonra, bu ayrıcalığa arkadaş sınıf veya fonksiyonların da sahip olduğunu göreceğiz.) public elemanlara eleman fonksiyonlar dışında, sınıfa ait nesnenin kapsam alanında olması koşuluyla, programın herhangi bir fonksiyonundan erişilebilir.

ERİŞİM DÜZEYLERİ (public ve private)-2 Sınıfa ait olmayan bir fonksiyon bir private elemana erişme girişiminde bulunursa derleyici hata üretir: int main() { int i; Tarih dogum1( 3, 12, 1985 ) i = dogum1.ay;//Error: private saha okunamaz dogum1.gun=1;//Error: private saha degistirilemez return 0; } Fakat, public elemanlara (örn. goruntule fonksiyonu) erişim mümkündür.

ERİŞİM DÜZEYLERİ (public ve private)- 3 Birçok programcının private elemanları bir grupta ve public elemanları bir başka grupta toplamayı tercih etmesine karşın, private ve public etiketleri bir sınıfın tanımında istenilen sayıda yinelenebilir. Bütün sınıf tanımlamalarında varsayılan başlangıç modu private erişim modudur. Fakat, yine de okunurluğu artırmak için bütün bölümleri etiketlemekte yarar vardır. Tarih sınıfında da örneklendiği gibi, C++’da yaygın olan bir konvansiyon public arayüzün bütünüyle fonksiyonlardan oluşturulmasıdır; bir private veriyi bu amaç için tasarlanmış public bir eleman fonksiyon ile görüntüleyebilir ya da değiştirebilirsiniz.

ELEMAN FONKSİYONLAR- 1 Eleman fonksiyonların prototipi ait olduğu sınıfın bildirimi içinde yer alır. Sınıf dışında sınıfa ait bir fonksiyon tanımlanırken, fonksiyonun ismi, sınıfın ismi ve kapsam çözümleme operatörü birlikte kullanılır: Tarih::goruntule() Bu gösterim fonksiyonun bir sınıfa ait olduğunu ve isminin bu sınıfın kapsam alanında yer aldığını ifade etmektedir. Bu kapsam alanın dışında aynı isim, başka fonksiyonları adlandırmak için kullanılabilir.

ELEMAN FONKSİYONLAR- 2 Her bir versiyonun parametre listesi ile diğerlerinden ayrılması koşuluyla, bir eleman fonksiyonu, herhangi bir diğer fonksiyon gibi aşırı yükleyebilirsiniz. Eleman fonksiyonlar, sınıflarının diğer elemanlarına nesne ismi belirtmeksizin erişebilirler.

ELEMAN FONKSİYONLAR- 3 Bir eleman fonksiyon, nesneye işaret eden bir işaretçi aracılığıyla da çağrılabilir: Tarih doğum1( 3, 12, 1985 ) Tarih *tarihPtr = &doğum1; tarihPtr -> goruntule();

ELEMAN FONKSİYONLAR- 4 Bir eleman fonksiyon bir nesne referansı aracılığıyla bile çağrılabilir: Tarih doğum1( 3, 12, 1985 ) Tarih &digerTarih = doğum1; digerTarih.goruntule();

YAPICI FONKSİYONLAR - 1 C’de kodladığımız tarih “structure”ının geçerli değerleri içermeyi doğrudan garanti edememek gibi bir dezavantajı olduğunu görmüştük. C++’da bu tür bir dezavantajı gidermenin bir yolu yapıcı fonksiyon yazmaktır. Yapıcı fonksiyonlar sınıfınızın herhangi bir nesnesinin bildirimi yapıldığında, otomatik olarak çağrılan özel türde ilk değer atama fonksiyonlarıdır; ilk değer almamış nesnelerin kullanımından kaynaklanabilecek hataları engellerler.

YAPICI FONKSİYONLAR - 2 Yapıcı fonksiyonun ait olduğu sınıf ile aynı isme sahip olması gerekir. Örneğin, Tarih sınıfının yapıcı fonksiyonu Tarih olarak adlandırılmıştır. #include <iostream> using namespace std; class Tarih { public: Tarih( int mn, int dy, int yr ); void goruntule(); ~Tarih(); private: int ay, gun, yil; };

YAPICI FONKSİYONLAR - 3 Tarih yapıcı fonksiyonunun gerçeklemesine baktığımızda fonksiyonun yalnızca nesnenin eleman sahalarına ilk değer atamakla kalmayıp belirtilen değerlerin geçerliliğini de kontrol ettiğini görüyoruz. Bu yapıcı fonksiyonlar aracılığıyla nesnelerin anlamlı değerler içermesini sağlamanın bir diğer yoludur. int main() { // Gecerli bir Tarih bildirimi Tarih dogum1(3, 12, 1985); // Gecersiz bir Tarih bildirimi Tarih dogum2(23, 259, 1966); }

YAPICI FONKSİYONLAR - 4 Bir sınıf nesnesinin kapsam alanına her girişinde yapıcı fonksiyon koşturulur. Nesne bildirimi tamsayı bildirimine benzer. Önce veri tipi, ardından da nesnenin ismi belirtilir: Tarih doğum1( 3, 12, 1985 ); Fakat, nesnenin bildirimi parantez içinde bir argüman listesi de içerebilir. Bu argümanlar yapıcı fonksiyona parametre değeri olarak gönderilir ve nesnenin ilk değer atamasında kullanılır.

YAPICI FONKSİYONLAR - 5 Bir yapıcı fonksiyon bildiriminde bulunurken, void dahil, döndürülecek herhangi bir değer tipi belirtemezsiniz. Dolayısıyla, bir yapıcı fonksiyon herhangi bir return ifadesi de içermez. Yapıcı fonksiyonlarınızı aşırı yükleyerek, bir sınıf için birden fazla yapıcı fonksiyon bildiriminde bulunabilirsiniz. Gerçekte, bir sınıf tanımlarken herhangi bir yapıcı fonksiyon tanımlama zorunluluğu yoktur. Eğer hiçbir yapıcı fonksiyon tanımlamazsanız derleyici otomatik olarak hiçbir parametre almayan ve hiçbir şey yapmayan bir tane üretir.

YIKICI FONKSİYONLAR - 1 Yıkıcı fonksiyonlar, yapıcı fonksiyonların zıt işlevselliğine sahiptirler. Bir sınıf nesnesi kapsam alanının dışına çıkınca otomatik olarak yıkıcı fonksiyon çağrılır. Yıkıcı fonksiyonun görevi bir nesne yok edilmeden önce gerekli bütün `temizlik’ işlerini yapmaktır. Yıkıcılar nesne yok edilirken çağrılırlar. Sistem hafızayı geri alırken sonlandırma temizliğini yapar, böylece hafıza alanı yeni nesnelerin tutulması için tekrar kullanılabilir.

YIKICI FONKSİYONLAR - 2 Yıkıcı fonksiyonların başlarına almak zorunda oldukları tilda (~) sembolü vardır. Yıkıcı fonksiyonun ismi sınıf ismi ile aynıdır. ~Tarih(); Yıkıcı fonksiyonları da açıkça tanımlama zorunluluğu yoktur. Yıkıcı fonksiyonlar aşırı yüklenemez; yalnızca bir tane olmak zorundadırlar. Yıkıcı bir fonksiyon parametre alamaz ve değer döndüremez.

NESNELERİN YARATILMASI VE YOK EDİLMESİ - 1 Örnek: // DEMO.CPP #include <iostream> #include <cstring> using namespace std; class Demo { public: Demo( const char *nm ) ~Demo(); private: char isim[20]; };

NESNELERİN YARATILMASI VE YOK EDİLMESİ - 2 Demo::Demo( const char *nm ) { strncpy( isim, nm, 20 ); cout <<isim<< “ icin yapici fonksiyon cagrimi\n”; } Demo::~Demo() cout <<isim<< “ icin yikici fonksiyon cagrimi\n”; void fonk() { Demo yerelFonkNesnesi( “yerelFonkNesnesi” ); static Demo staticNesne( “statikNesne” ); cout << “fonk icinde” << endl;

NESNELERİN YARATILMASI VE YOK EDİLMESİ - 3 Demo globalNesne( “globalNesne” ); int main() { Demo yerelMainNesnesi( “yerelMainNesnesi” ); cout << “fonk cagrimindan once, main icinde\n”; fonk(); cout << “fonk cagrimindan sonra, main icinde\n”; return 0; }

NESNELERİN YARATILMASI VE YOK EDİLMESİ - 4 Yerel nesneler için, yapıcı fonksiyon nesnenin bildirimi yapıldığında, yıkıcı fonksiyon ise program bildiriminin yapıldığı bloktan çıkarken çağrılır. Global nesneler için, yapıcı fonksiyon program başlarken, yıkıcı fonksiyon ise program sona ererken çağrılır. Statik nesneler için, yapıcı fonksiyon nesnenin bildiriminin yapıldığı fonksiyona ilk girişte, yıkıcı fonksiyon ise program sona ererken çağrılır.

NESNELERİN YARATILMASI VE YOK EDİLMESİ - 5 Program çıktıları: globalNesne icin yapici fonksiyon cagrimi yerelMainNesnesi icin yapici fonksiyon cagrimi fonk cagrimindan once, main icinde yerelFonkNesnesi icin yapici fonksiyon cagrimi statikNesne icin yapici fonksiyon cagrimi fonk icinde yerelFonkNesnesi icin yikici fonksiyon cagrimi fonk cagrimindan sonra, main icinde yerelMainNesnesi icin yikici fonksiyon cagrimi statikNesne icin yikici fonksiyon cagrimi globalNesne icin yikici fonksiyon cagrimi

ELEMAN SAHALARA ERİŞİM - 1 Şu anki haliyle, Tarih sınıfı gun, ay ve yil bileşenlerine erişim izni vermemektedir; örneğin, bir Tarih nesnesinin ay değerini okuyup değiştiremezsiniz. Bu sorunu gidermek için Tarih sınıfı aşağıdaki gibi değiştirilebilir: class Tarih { public: Tarih( int mn, int dy, int yr ); int aySoyle(); int gunSoyle(); int yilSoyle(); int ayBelirle( int mn ); int gunBelirle ( int dy ); int yilBelirle( int yr ); void goruntule(); ~Tarih(); private: int ay, gun, yil; };

ELEMAN SAHALARA ERİŞİM - 2 Erişim fonksiyonları şöyle tanımlanabilir: inline int Tarih::aySoyle() { return ay; } inline int Tarih::gunSoyle() { return gun; } inline int Tarih::yilSoyle() { return yil; } void Tarih::ayBelirle( int mn ) { ay = max( 1, mn ); ay = min( ay, 12 ); }

ELEMAN SAHALARA ERİŞİM - 3 void Tarih::gunBelirle( int dy ) { static int uzunluk[] = { 0,31,28,31,30,31,30, 31,31,30,31,30,31 }; gun = max( 1, dy ); gun = min( gun, uzunluk[ay] ); } void Tarih::yilBelirle( int yr ) yil = max( 1, yr ); }

ELEMAN SAHALARA ERİŞİM - 4 Aşağıdaki örnekte main fonksiyonu yeni tanımladığımız erişim fonksiyonlarını kullanmaktadır: int main() { int i; Tarih sonTarih( 3, 10, 2005 ); i = sonTarih.aySoyle(); sonTarih.ayBelirle( 4 ); sonTarih.ayBelirle(sonTarih.aySoyle()+1); return 0; }

ELEMAN inline FONKSİYONLAR Soyle fonksiyonları çok kısa olmaları nedeniyle ve çağrımlarının “overhead” içermemesi nedeniyle inline olarak bildirildiler. Eleman fonksiyonların gövdesini sınıf bildirimi içine yerleştirmeniz halinde inline anahtar sözcüğünü kullanmadan inline bildirimlerini sağlamış olursunuz: class Tarih { public: Tarih( int mn, int dy, int yr ); int aySoyle() { return ay; } int gunSoyle() { return gun; } int yilSoyle() { return yil; } // ... };

YAPICI FONKSİYONLARIN AŞIRI YÜKLENMESİ - 1 Yeni eleman fonksiyonlarımızla, bir Tarih nesnesinin nasıl yaratılacağını yeniden belirleyebiliriz: class Tarih { public: Tarih(); Tarih( int mn, int dy, int yr ); // ... }; Tarih::Tarih() { ay = gun = yil = 1;} Tarih::Tarih( int mn, int dy, int yr ) { ayBelirle( mn ); gunBelirle( dy ); yilBelirle( yr ); }

YAPICI FONKSİYONLARIN AŞIRI YÜKLENMESİ - 1 void main() { Tarih dogum1; Tarih dogum2( 12, 25, 1990 ); dogum1.ayBelirle( 3 ); dogum1.gunBelirle( 12 ); dogum1.yilBelirle( 1985 ); }

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; }; dogumTarih nesnesi KisiBilgisi sınıfından bir nesne yaratılıncaya kadar yaratılmaz.

ELEMAN NESNELER - 2 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 önce 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 stck[SIZE]; int tos; public: stack(); // constructor ~stack(); // destructor void push(int i); int pop(); };

Örnek – devam… // Yapici Fonksiyon stack::stack() { tos = 0; cout << "Stack Initialized\n"; } // Yikici Fonksiyon stack::~stack() cout << "Stack Destroyed\n";

Örnek – devam… void stack::push(int i) { if(tos==SIZE) { cout << "Stack is full.\n"; return; } stck[tos] = i; tos++;

Örnek – devam… int stack::pop() { if(tos==0) { cout << "Stack underflow.\n"; return 0; } tos--; return stck[tos];

. Örnek – devam… 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; }

Örnek – devam… Program Çıktısı: Stack Initialized 3 1 4 2 Stack Destroyed