Nesneye Dayalı Programlama

Slides:



Advertisements
Benzer bir sunumlar
MATLAB Bilgisayar Programlama Yrd.Doç. Dr. Aslıhan KURNUÇ
Advertisements

Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
MIT504 İnternet ve Web Programlama: Javascript programlama devam Yrd. Doç. Dr. Yuriy Mishchenko.
Nesneye Yönelik Programlama
Nesneye Dayalı Programlama
YAPAY ZEKA ÖDEV - 3 Kenan KILIÇASLAN Trakya Üniversitesi Fen Bilimleri Enstitüsü Makina Mühendisliği Doktora Programı.
VERİ TABANI YÖNETİMİ Ders 11: PL/SQL’e Giriş
Yrd. Doç.Dr. Nilgün GÜLER BAYAZIT
Nesneye Dayalı Programlama
Bozok Üniversitesi Bologna Süreci Uyum Çalışmaları Yrd. Doç. Dr. Orhan ER Amaç ve Hedefler Yrd.Doç.Dr. Orhan ER.
Bilgisayar Programlama
NESNEYE DAYALI MODELLEME VE TASARIM
Nesneye Yönelik Programlama
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 3: Döngüler
MIT505 İnternet ve Web Programlama: Dinamik web sayfaları, javascript
Nesneye Dayalı Programlama
Nesneye Dayalı Programlama
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 5: Fonksiyonlar
Nesneye Yönelik Programlama (2. Sunu). Konsol Üzerinde Türkçe Karakterler Görebilmek İçin…
Görsel Programlama Dr. Muhammet Balcılar
Nesneye Dayalı Programlama
XOP Yrd. Doç. Dr. Zafer NERGİZ Niğde Üniversitesi.
Temel Kavramlar, İşlemler, Operatörler
Yrd. Doç. Dr. Ayhan Demiriz
Yrd.Doç.Dr.Mehmet Akif Ocak.  Oyun ve oyunun özellikleri  Oyunun psikolojik ve sosyolojik incelemesi  Bireylerin gelişimsel özellikleri ve oyun ilişkisi.
T.C FIRAT ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ DERSİN ADI:ALGORİTMA VE PROGRAMLAMA2 DERSİN HOCASI:YRD. DOÇ. GALİP AYDIN PROJENİN.
Nesneye Dayalı Programlama
Veri Tabanı Yönetim Sistemleri 2 Ders 2 Oracle 11g Kurulumu
ÇEV 4035 Çevresel Dispersiyon Animasyonlar DEÜ Çevre Mühendisliği Bölümü Yrd.Doç.Dr. Alper ELÇİ 2008/2009 Güz dönemi.
Ders İçerik Sunusu Maltepe Üniversitesi
Makİne Öğrenmesİ İle Ürün SInIflandIrma İncelemesi
Sakarya Üniversitesi Eğitim Bilgi Sistemi Toplantısı, 29 Nisan 2011, SAU Kültür ve Kongre Merkezi Öğretim ve Ölçme Değerlendirme Yöntemi Neden Belirlenmeli.
BİLGİ İŞLEM DAİRESİ BAŞKANLIĞI Bilgi İşlem Şube Müdürlüğü
Bilgisayar Mühendisliği Bölümü
Okulda Yönetime Ve Karara Katılım TUNCAY TAŞBAŞ , ALPER ALEMDAR , Karadeniz Teknik Üniversitesi, Fatih Eğitim Fakültesi, Bilgisayar ve.
Okulda Yönetime Ve Karara Katılım TUNCAY TAŞBAŞ , ALPER ALEMDAR , Karadeniz Teknik Üniversitesi, Fatih Eğitim Fakültesi, Bilgisayar ve.
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Okulda Yönetime Ve Karara Katılım TUNCAY TAŞBAŞ , ALPER ALEMDAR , Karadeniz Teknik Üniversitesi, Fatih Eğitim Fakültesi, Bilgisayar ve.
Atatürk Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi Atatürk Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi.
BTO-302 İnternet Ortamında Yazarlık Dilleri ve Uygulamaları Dersi Grup Projesi Hazırlayan: Grup HIZLI ve ÖFKELİ Gülsüm KARABAĞLI Anıl ŞAHİN Sertaç KARATEKE.
Bilgisayar Mühendisliğine Giriş
Mühendislikte Bilgisayar Uygulamaları Mustafa Öztürk.
Yapay Zeka Desteği ile Parfüm Öneri Sistemi
Bilgisayar Programlama
ERZURUM TEKNİK ÜNİVERSİTESİ MÜHENDİSLİK ve MİMARLIK FAKÜLTESİ İNŞAAT MÜHENDİSLİĞİ BÖLÜMÜ GÜZ DÖNEMİ MMF 202 SAYISAL YÖNTEMLER DERSİ DERS BİLGİLENDİRMESİ.
Genel Fizik Ders Notları
ANAHTARLAMALI DA-DA ÇEVİRİCİLER TAM KÖPRÜ DA-DA ÇEVİRİCİLER
Bilgisayar Mühendisliği Bölümü
ANAHTARLAMALI DA-DA ÇEVİRİCİLER YÜKSELTİCİ TİP (BOOST) ÇEVİRİCİLER
GÜÇ ELEKTRONİĞİ II EEM Yrd. Doç. Dr. Bilal GÜMÜŞ Dicle Üniversitesi
PHP’DE ARİTMATİKSEL OPERATÖRLER.
Endüstri mühendisliği.
Nesneye Dayalı Programlarla Nesne İlişki Haritalanması
YAPISAL PROGRAMLAMA Hafta-6
4- OPERATÖR – koşul - döngü Nesne Yönelimli Programlama - i
ETKİNLİK PROGRAMI 24 Kasım 2014 Saat: 17:00 Kokteyl 18:00
Bilgisayar Mühendisliğine Giriş
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
Doç. Dr. Yalçın KIRDAR Maltepe Üniversitesi İletişim Fakültesi Halkla İlişkiler ve Tanıtım Bölümü Öğretim Üyesi.
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
Matrisler Yrd. Doç. Dr. Meriç Çetin 2017.
Sunum transkripti:

Nesneye Dayalı Programlama DERS 4 Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Operatörlere Yeni İşlevler Yüklenmesi ( Operator Overloading) C++’da hazır olarak var olan operatörlere (+, -, *, / , ! , << , ++ vs.) ilişkin fonksiyonlar yazarak bu operatörlerin sizin belirlediğiniz işlemleri yapmasını sağlayabilirsiniz. Operatör fonksiyonları bir sınıfın üyesi de olabilirler. Böylece o sınıftan yaratılan nesneler üzerinde işlemler yapan operatörler tanımlanmış olur. C++’da operatör kullanımı fonksiyon çağrılarına karşı düşmektedir. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Operatörlere yeni işlevler yükleyerek yapılabilecek her şey normal fonksiyonlar ile de yapılabilir. Fonksiyon isimleri yerine operatörleri kullanmak programın yazılmasını ve okunmasını kolaylaştırabilir. Bu nedenle bir operatöre işlev yüklemek, eğer program daha kolay okunur ve anlaşılır olacaksa tercih edilmelidir. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Sınırlamalar: C++’da olmayan operatörlere işlev yüklenemez. Örneğin üs alma işlemi için ‘^’ simgesine ya da ‘**’ simgesine bir işlev yüklenemez. C++’da var olan operatörlerden bazılarına da yeni işlev yüklenemez. Bunlar: nokta operatörü ‘.’ , yaşam alanı belirleme operatörü ‘::’ , koşul operatörü ‘? :’ ve boyut operatörüdür ‘sizeof’ . Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli C++ operatörleri birli ve ikili olmak üzere iki gruba ayrılabilir. Birli operatörler tek operand alırlar. Örneğin: -a, a++, !a . İkili operatörler ise iki operand alırlar; a+b, a/b gibi. Operatörlere işlev yüklerken operand sayısı değiştirilemez. Operatörlerin öncelikleri değiştirilemez. Derleyicinin hazır veri tipleri üzerinde işlem yapan operatörlere yeni işlev yüklenemez. Örneğin iki tamsayıyı toplayan + operatörü değiştirilemez. Yeni oluşturulan operatörlerin en az bir operandının tipi bir sınıf olmalıdır. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

+ Operatörüne Yeni Bir İşlev Yüklenmesi Aşağıdaki örnekte ComplexT sınıfına + operatörü için bir metot eklenecektir. Böylece + operatörünün karmaşık sayıları toplaması sağlanacaktır. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 1 class ComplexT{ // Karmaşık (Kompleks) sayıları tanımlamak için oluşturulan sınıf double re , im; // reel ve sanal kısımlar public: ComplexT(double re_in=0, double im_in=1); // Kurucu ComplexT operator+(const ComplexT & ) const; // + operatörünün fonksiyonu void goster() const; }; // + operatörü ComplexT ComplexT::operator+(const ComplexT &c) const { double yeni_re, yeni_im; yeni_re = re + c.re; yeni_im = im + c.im; return ComplexT(yeni_re , yeni_im); } int main() ComplexT z1(1,1) , z2(2,2) , z3; z3 = z1 + z2; // z3=z1.operator+(z2) return 0; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Atama Operatörüne “=“ Yeni Bir İşlev Yüklenmesi Atama işlemi programlarda çok sık kullanıldığından C++ derleyicisi her sınıfa atama operatörü için bir fonksiyon yerleştirir. Derleyicinin yerleştirdiği fonksiyon bir nesnenin verilerini var olan başka bir nesnenin veri alanlarına bire bir kopyalar. Eğer bu bire bir atama işlemi o sınıf için yeterli ise programcının atama operatörü için bir fonksiyon yazmasına gerek kalmaz. İçinde işaretçi olmayan sınıflar için genellikle derleyicinin sağladığı fonksiyon yeterlidir. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örneğin karmaşık sayılar için aşağıda gösterilen atama fonksiyonu gereksizdir. void ComplexT::operator=(const ComplexT& z) // Gereksiz { re = z.re; im = z.im; } Bu fonksiyon yazılmasaydı derleyicinin yerleştireceği fonksiyon da aynı işi yapardı. Eğer sınıfta bir atama fonksiyonu varsa, artık derleyici tüm atama işleri için bu fonksiyonu kullanır. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 2 #include <iostream> using namespace std; // Karmaþýk (Kompleks) sayýlarý tanýmlamak için oluþturulan sýnýf class ComplexT{ double re,im; // reel ve sanal kýsýmlar public: ComplexT(double re_in=0,double im_in=1): re(re_in),im(im_in) {}; // Kurucu (gövdesi boþ) void operator=(const ComplexT & ); // = Operatörü void goster() const; }; // = operatörü void ComplexT::operator=(const ComplexT &c) { re = c.re; // Atamalar yapýlýyor im = c.im; cout << "Atama fonksiyonu calisti" << endl; // Çalýþtýðýný ekranda görnmek için } // Nesne ile ilgili bilgileri ekrana çýkaran metot void ComplexT::goster() const cout << "re=" << re << " im=" << im << endl; int main() ComplexT z1(1,2),z2; z2.goster(); // Atamadan önceki içerik z2=z1; z2.goster(); // Atamadan sonraki içerik return 0; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Ancak her sınıf için derleyicinin sağladığı atama fonksiyonu yeterli olmayabilir. Özellikle içinde işaretçi olan sınıflarda programcının atama operatörüne ilişkin fonksiyonu yazması gerekebilir. Kopyalama kurucusundakine benzer bir problem burada da vardır. Aşağıda örnek String sınıfı için atama fonksiyonu yazılmıştır. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 3 class String{ // Örnek (karakter katarı) String sınıfı int boy; // Katarın boyu char *icerik; // Katarın içeriği public: String(); // Parametresiz kurucu String(const char *); // Kurucu String(const String &); // Kopyalama kurucusu void operator=(const String &); // Atama operatörü void goster(); // Katarları ekrana çıkaran üye fonksiyon ~String(); // Yok edici fonksiyon }; // Atama Operatörü void String::operator=(const String &gelen_nesne) { cout<< "Atama operatoru calisti" << endl; boy = gelen_nesne.boy; delete [] icerik; // Eski içerik belleğe iade ediliyor icerik = new char[boy + 1]; // +1 null karakteri icin strcpy(icerik, gelen_nesne.icerik); } Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Derleyicinin sağladığı fonksiyon: Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Eğer operatör fonksiyonlarının geri dönüş değeri tipleri void olarak yazılırsa bu operatörler peş peşe bağlanamaz. Bir önceki örnekte gösterilen atama fonksiyonu geriye bir değer döndürmemektedir (void) . Bu nedenle bu operatörü kaskad olarak yazmak ( a = b = c gibi) mümkün değildir. Operatörleri kaskad bağlayabilmek için operatöre ilişkin fonksiyon, üzerinde işlem yapılan nesnenin referansını geri göndermelidir. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 4 #include <iostream> #include <cstring> // string fonksiyonlarý için using namespace std; class String{ // Örnek (karakter katarý) String sýnýfý int boy; // Katarýn boyu char *icerik; // Katarýn içeriði public: String(); // Parametresiz kurucu String(const char *); // Kurucu String(const String &); // Kopyalama kurucusu const String& operator=(const String &); // Atama operatörü void goster(); // Katarlarý ekrana çýkaran üye fonksiyon ~String(); // Yok edici fonksiyon }; // Parmatresiz Kurucu Fonksiyon // Sadece NULL içeren bir boþ katar oluþturur String::String() { cout<< "Parametresiz Kurucu calisti" << endl; boy = 0; // boþ katarýn boyu sýfýr icerik = new char[1]; // icerik için yer ayrýldý, null icin strcpy(icerik, ""); // boþ katar } Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli // Kurucu Fonksiyon // Parametre olarak aldýðý katarý nesnenin içeriðine kopyalar String::String(const char *gelen_veri) { cout<< "Kurucu calisti" << endl; boy = strlen(gelen_veri); // gelen katarýn boyu hesaplandý icerik = new char[boy +1]; // icerik için yer ayrýldý, +1 null icin strcpy(icerik, gelen_veri); // gelen veri icerik'in gosterdigi yere kopyalanýyor } // Kopyalama kurucusu String::String(const String &gelen_nesne) cout<< "Kopyalama Kurucusu calisti" << endl; boy = gelen_nesne.boy; icerik = new char[boy + 1]; // +1 null karakteri icin strcpy(icerik, gelen_nesne.icerik); // Atama Operatörü const String& String::operator=(const String &gelen_nesne) cout<< "Atama operatoru calisti" << endl; delete [] icerik; // Eski içerik belleðe iade ediliyor return *this; // Kendi adresini geri gönderiyor Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli void String::goster() { cout<< icerik << ", " << boy << endl; // Katar ve boyu ekrana yazýlýyor } // Yok edici Fonksiyon // icerik tarafýndan isaret edilen bellek geri veriliyor String::~String() cout<< "Yok edici calisti" << endl; delete[] icerik; //-------- Ana Program ---------------- int main() // Ana fonksiyon String s1("Katar 1"); String s2 = s1; // Kopyalama kurucusu çalýþýr s2.goster(); String s3 , s4; s3 = s4= s2; // Atama operatörü 2 defa çalýþýr s3.goster(); s4.goster(); return 0; Atama operatörü ile kopyalama kurucusu benzer işler yapmakla beraber farklı zamanlarda canlanırlar. Kopyalama kurucusu yeni bir nesne yarılırken canlanır ve eski bir nesnedeki bilgileri yeni nesneye kopyalar. Atama operatörü ise var olan bir nesneye başka bir nesnedeki değerler atanırken canlanır. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

İndis Operatörüne ( Subscript Operator) “[]“ Yeni Bir İşlev Yüklenmesi Tüm operatör fonksiyonları için aynı kurallar geçerli olduğundan hepsini ayrı ayrı anlatmaya gerek yoktur. Ancak ilginç ve yararlı olabilecek bazı operatörler açıklanmıştır. Bunlardan biri de indis operatörüdür. Bu operatöre ilişkin fonksiyon iki farklı yapıda olabilir: class C{ dönüş tipi & operator [] (parametre tipi); ya da const dönüş tipi & operator [] (parametre tipi) const; }; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Birinci yazım şekli, eğer bu operatör ile nesnenin verileri değiştirilecekse kullanılır. Bu durumda operatör bir atama operatörünün solunda yer alabilir. İkinci yazım şeklinde ise fonksiyon sabit olarak tanımlanmıştır. Bu durumda operatör ile nesnenin verileri sadece okunabilir. c bir nesne olmak üzere c[i] ifadesi c.operator[](i) anlamına gelir. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli İndis operatörüne String sınıfında kullanılmak üzere bir işlev yüklenecektir. Bu operatör bir katardaki i. karaktere erişilmesini sağlayacaktır. Eğer i sıfırdan küçük verilirse katardaki ilk elemana, eğer i katarın boyundan büyük verilirse katardaki son elemana erişilmiş olacaktır. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 4 #include <iostream> #include <cstring> // string fonksiyonlarý için using namespace std; class String{ // Örnek (karakter katarý) String sýnýfý int boy; // Katarýn boyu char *icerik; // Katarýn içeriði public: String(const char *); // Kurucu char & operator[](int i); // Ýndis operatörü void goster(); // Katarlarý ekrana çýkaran üye fonksiyon ~String(); // Yok edici fonksiyon }; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli // Kurucu Fonksiyon // Parametre olarak aldýðý katarý nesnenin içeriðine kopyalar String::String(const char *gelen_veri) { cout<< "Kurucu calisti" << endl; boy = strlen(gelen_veri); // gelen katarýn boyu hesaplandý icerik = new char[boy +1]; // icerik için yer ayrýldý, +1 null icin strcpy(icerik, gelen_veri); // gelen veri icerik'in gosterdigi yere kopyalanýyor } // Ýndis Operatörü char& String::operator[](int i) cout << "Indis operatoru calisti" << endl; if(i < 0) return icerik[0]; // Ýlk eleman gönderiliyor if(i >= boy) return icerik[boy-1]; // Son eleman gönderiliyor return icerik[i]; // i. eleman gönderiliyor Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli void String::goster() { cout<< icerik << ", " << boy << endl; // Katar ve boyu ekrana yazýlýyor } // Yok edici Fonksiyon // icerik tarafýndan isaret edilen bellek geri veriliyor String::~String() cout<< "Yok edici calisti" << endl; delete[] icerik; //-------- Ana Program ---------------- int main() // Ana fonksiyon String s1("Katar 1"); s1[1] = 'X'; // Katarýn 2. karakteri 'X' oldu s1.goster(); cout << "Katarin 3 numarali elemani = " << s1[3] << endl; return 0; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Fonksiyon Çağırma ( Function Call ) Operatörüne “()“ Yeni Bir İşlev Yüklenmesi Bu operatörü diğerlerinden ayıran özellik, operand sayısının programcı tarafından belirlenebilmesidir.Bu operatöre ilişkin fonksiyon aşağıdaki yapıda olur: class C{ dönüş tipi operator () (parametre tipleri); }; c bir nesne olmak üzere c(i,j,k) ifadesi c.operator()(i,j,k) anlamına gelir. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 5 #include <iostream> using namespace std; // Karmaþýk (Kompleks) sayýlarý tanýmlamak için oluþturulan sýnýf class ComplexT{ double re,im; // reel ve sanal kýsýmlar public: ComplexT(double re_in=0,double im_in=0):re(re_in),im(im_in) {}; // Kurucu, gövdesi boþ ComplexT operator+(const ComplexT & ) const; // + operatörünün fonksiyonu void operator()() const; // () operatörünün fonksiyonu }; // + operatörü ComplexT ComplexT::operator+(const ComplexT &c) const { double yeni_re, yeni_im; yeni_re=re+c.re; yeni_im=im+c.im; return ComplexT(yeni_re,yeni_im); } Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli // () operatörü // Nesne ile ilgili bilgileri ekrana yazar void ComplexT::operator()() const { cout << "re=" << re << " im=" << im << endl ; } int main() ComplexT z1(1,1),z2(2,2),z3; z1(); z2(); z3=z1+z2; z3(); return 0; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 6 Bu örnekte ise fonksiyon çağırma operatörünün parametreli olarak kullanımı gösterilmiştir. Örnekteki operatör, bir karakter katarının (String) istenen bir miktarını, istenen bir bellek bölgesine kopyalamaktadır. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli #include <iostream> #include <cstring> // string fonksiyonlarý için using namespace std; class String{ // Örnek (karakter katarý) String sýnýfý int boy; // Katarýn boyu char *icerik; // Katarýn içeriði public: String(); // Parametresiz kurucu String(const char *); // Kurucu void operator()(char *, int) const; // () operatörü ~String(); // Yok edici fonksiyon }; // Parmatresiz Kurucu Fonksiyon // Sadece NULL içeren bir boþ katar oluþturur String::String() { cout<< "Parametresiz Kurucu calisti" << endl; boy = 0; // boþ katarýn boyu sýfýr icerik = new char[1]; // icerik için yer ayrýldý, null icin strcpy(icerik, ""); // boþ katar } Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli // Kurucu Fonksiyon // Parametre olarak aldýðý katarý nesnenin içeriðine kopyalar String::String(const char *gelen_veri) { cout<< "Kurucu calisti" << endl; boy = strlen(gelen_veri); // gelen katarýn boyu hesaplandý icerik = new char[boy +1]; // icerik için yer ayrýldý, +1 null icin strcpy(icerik, gelen_veri); // gelen veri icerik'in gosterdigi yere kopyalanýyor } // Fonksiyon çaðýrma operatörü(): Bir katarýn içeriðinin belli bir kýsmýný // verilen bir bellek bölgesine kopyalar // Parametre olarak hedef belleðin adresini ve kopyalanacak karakter sayýsýný alýr void String::operator()(char * hedef, int sayi) const if (sayi>boy) sayi=boy; // sayi katarýn boyundan uzunsa for (int k=0; k< sayi; k++) hedef[k]= icerik[k]; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli // Yok edici Fonksiyon // icerik tarafýndan isaret edilen bellek geri veriliyor String::~String() { cout<< "Yok edici calisti" << endl; delete[] icerik; } //-------- Ana Program ---------------- int main() // Ana fonksiyon String s1("Ornek Program"); char *c = new char[8]; // Hedef bellek bölgesi s1(c,7); // 7 karakter kopyalandý c[7]='\0'; // Katar sonunu belirtmek için (null) cout << c << endl; // Kopyalanan karakterler ekrana yazýlýyor delete c; // Alýnan bellek bölgesi iade ediliyor return 0; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Bir Operandlı (Unary) Operatörlere Yeni Bir İşlev Yüklenmesi Birli operatörlere örnekler: arttırma (++), azaltma(--), eksileme(-5), mantıksal tümleme (!) vs. Bu operatörlere ilişkin fonksiyonlar bir sınıfın üyesi olarak yazıldıklarında hiç parametre almazlar. Çünkü üzerinde çağırıldıkları nesne üzerinde işlem yaparlar. Bu operatörler normalde nesnen,n solunda yer alırlar: !n, -n, ++n gibi. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 7 Aşağıdaki örnekte ++ operatörüne, karmaşık sayıların reel kısmını 0.1 arttırma işlevi yüklenmiştir. #include <iostream> using namespace std; // Karmaþýk (Kompleks) sayýlarý tanýmlamak için oluþturulan sýnýf class ComplexT{ double re,im; // reel ve sanal kýsýmlar public: ComplexT(double re_in=0,double im_in=1): re(re_in),im(im_in) {}; // Kurucu (gövdesi boþ) const ComplexT& operator++( ); // ++ Operatörü void goster() const; }; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli // ++ operatörü // Karmaþýk sayýlarýn reel kýsmýný 0.1 kadar arttýrmaktadýr. const ComplexT & ComplexT::operator++() { re=re+0.1; // reel kýsým arttýrýlýyor return *this; // Nesnenin referansý döndürülüyor } // Nesne ile ilgili bilgileri ekrana çýkaran metot void ComplexT::goster() const cout << "re=" << re << " im=" << im << endl; //---- Ana Program ----- int main() ComplexT z1(1.2,0.5),z2; z2= ++z1; z1.goster(); z2.goster(); return 0; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Bilindiği gibi ++ ve – operatörleri operandların hem soluna hem de sağına yazılabilirler. Bir atama deyimi ile birlikte kullanıldıklarında operatörlerin yazılma şekli önemli olur. Buna göre önceden arttırma (azaltma) ya da sonradan arttırma (azaltma) anlamına gelirler. z2= ++ z1; // önceden arttırma z2 = z1++; // sonradan arttırma Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Operatör fonksiyonu operator++() şeklinde parametresiz olarak yazılırsa, önceden arttırma operatörüne bir işlev yüklenmiş olur. Sonradan arttırma operatörüne bir işlev yüklemek için fonksiyon bir parametreli olarak yazılır operator++(int). Buradaki parametrenin amacı sadece iki fonksiyonu birbirinden ayırmaktır. Fonksiyon çağrılırken herhangi bir parametre gönderilmez. Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Örnek 8 #include <iostream> using namespace std; // Karmaþýk (Kompleks) sayýlarý tanýmlamak için oluþturulan sýnýf class ComplexT{ double re,im; // reel ve sanal kýsýmlar public: ComplexT(double re_in=0,double im_in=1): re(re_in),im(im_in) {}; // Kurucu (gövdesi boþ) const ComplexT& operator++(); // önceden arttýrma ++ operatörü ComplexT operator++(int); // sonradan arttýrma ++ operatörü void goster() const; }; // Önceden arttýrma ++ operatörü // Karmaþýk sayýlarýn reel kýsmýný 0.1 kadar arttýrmaktadýr. const ComplexT & ComplexT::operator++() { re=re+0.1; // reel kýsým arttýrýlýyor return *this; // Nesnenin referansý döndürülüyor } Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli // Sonradan arttýrma ++ operatörü // Karmaþýk sayýlarýn reel kýsmýný 0.1 kadar arttýrmaktadýr. ComplexT ComplexT::operator++(int) // sonradan arttýrma operatörü { ComplexT gecici; gecici = *this; // nesnenin orijinal deðeri re=re+0.1; // reel kýsým arttýrýlýyor return gecici; // eski (artmamýþ) deðer döndürülüyor } // Nesne ile ilgili bilgileri ekrana çýkaran metot void ComplexT::goster() const cout << "re=" << re << " im=" << im << endl; //---- Ana Program ----- int main() ComplexT z1(1.2,0.5),z2; z2= ++z1; // operator ++() çalýþýr z1.goster(); z2.goster(); z2= z1++; // operator ++(int) çalýþýr return 0; Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli Karışık Örnekler #include<iostream> using namespace std; class Point { private: double x,y,z; public: Point(){x=0;y=0;z=0;} Point(double x_arg, double y_arg, double z_arg=0):x(x_arg),y(y_arg),z(z_arg){} Point Add (const Point &p); Point Subtract (const Point &p); double xa() const {return x;} double ya() const {return y;} double za() const {return z;} }; Point Point::Add(const Point &p) return Point (x+p.xa(),y+p.ya(),z+p.za()); } Point Point::Subtract(const Point &p) return Point (x-p.xa(),y-p.ya(),z-p.za()); int main() Point p1(3.0,4.0,5.0); Point p2(1.0,2.0,3.0); Point p3=p1.Add(p2); Point p4=p1.Subtract(p2); return 0; Output: 6 8 2 2 2 Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli #include<iostream> using namespace std; class Widget { public:Widget(){++count;} ~Widget(){--count;} static int count; }; int Widget::count=0; main() Widget w,x; cout<<w.count<<endl; Widget w,x,y,z; } Widget y; Output: 2 6 3 Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Sınıf Yapısının Sağladıkları Modelleme kolaylığı Kolay okunur ve anlaşılır programlar Özel verilerin korunması Hataların yöresel kalması Grup çalışmalarında kolaylık Yeni veri tipleri yaratma yeteneği Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli