40
Harran Üniversitesi Bilgisaya r Mühendisliği Yrd.Doç.Dr.Nur ettin Beşli Nesneye Dayalı Programlama DERS 4

Nesneye Dayal ı Programlama

  • Upload
    lada

  • View
    45

  • Download
    0

Embed Size (px)

DESCRIPTION

Nesneye Dayal ı Programlama. DERS 4. Operatörlere Yeni İşlevler Yüklenmesi ( Operator Overloading). C++’da hazır olarak var olan operatörlere (+, -, *, / , ! ,

Citation preview

Page 1: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Nesneye Dayalı Programlama

DERS 4

Page 2: Nesneye Dayal ı Programlama

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.

Page 3: Nesneye Dayal ı Programlama

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.

Page 4: Nesneye Dayal ı Programlama

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’ .

Page 5: Nesneye Dayal ı Programlama

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.

Page 6: Nesneye Dayal ı Programlama

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.

Page 7: Nesneye Dayal ı Programlama

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ıfdouble re , im; // reel ve sanal kısımlarpublic:ComplexT(double re_in=0, double im_in=1); // KurucuComplexT operator+(const ComplexT & ) const; // + operatörünün fonksiyonuvoid 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;}

Page 8: Nesneye Dayal ı Programlama

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.

Page 9: Nesneye Dayal ı Programlama

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.

Page 10: Nesneye Dayal ı Programlama

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ýfclass 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ýyorim = c.im;cout << "Atama fonksiyonu calisti" << endl; // Çalýþtýðýný ekranda görnmek için

}

// Nesne ile ilgili bilgileri ekrana çýkaran metotvoid ComplexT::goster() const{

cout << "re=" << re << " im=" << im << endl;}

int main(){

ComplexT z1(1,2),z2;z2.goster(); // Atamadan önceki içerikz2=z1;z2.goster(); // Atamadan sonraki içerikreturn 0;

}

Page 11: Nesneye Dayal ı Programlama

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.

Page 12: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Örnek 3class String{ // Örnek (karakter katarı) String sınıfıint boy; // Katarın boyuchar *icerik; // Katarın içeriğipublic:String(); // Parametresiz kurucuString(const char *); // KurucuString(const String &); // Kopyalama kurucusuvoid 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 ediliyoricerik = new char[boy + 1]; // +1 null karakteri icinstrcpy(icerik, gelen_nesne.icerik);}

Page 13: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Derleyicinin sağladığı fonksiyon:

Page 14: Nesneye Dayal ı Programlama

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.

Page 15: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Örnek 4#include <iostream>#include <cstring> // string fonksiyonlarý içinusing 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þtururString::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

}

Page 16: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Kurucu Fonksiyon// Parametre olarak aldýðý katarý nesnenin içeriðine kopyalarString::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 kurucusuString::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; 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);

return *this; // Kendi adresini geri gönderiyor

}

Page 17: Nesneye Dayal ı Programlama

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 veriliyorString::~String(){

cout<< "Yok edici calisti" << endl; delete[] icerik;

}

//-------- Ana Program ----------------int main() // Ana fonksiyon{ String s1("Katar 1");

String s2 = s1; // Kopyalama kurucusu çalýþýrs2.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ırve eski bir nesnedeki bilgileri yeni nesneye kopyalar. Atama operatörü ise varolan bir nesneye başka bir nesnedeki değerler atanırken canlanır.

Page 18: Nesneye Dayal ı Programlama

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 daconst dönüş tipi & operator [] (parametre tipi) const;};

Page 19: Nesneye Dayal ı Programlama

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.

Page 20: Nesneye Dayal ı Programlama

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.

Page 21: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Örnek 4

#include <iostream>#include <cstring>// string fonksiyonlarý içinusing 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

};

Page 22: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Kurucu Fonksiyon// Parametre olarak aldýðý katarý nesnenin içeriðine kopyalarString::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önderiliyorif(i >= boy)

return icerik[boy-1]; // Son eleman gönderiliyorreturn icerik[i]; // i. eleman gönderiliyor

}

Page 23: Nesneye Dayal ı Programlama

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 veriliyorString::~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' oldus1.goster();cout << "Katarin 3 numarali elemani = " << s1[3] << endl;

return 0;}

Page 24: Nesneye Dayal ı Programlama

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.

Page 25: Nesneye Dayal ı Programlama

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ýfclass 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 fonksiyonuvoid 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);

}

Page 26: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// () operatörü// Nesne ile ilgili bilgileri ekrana yazarvoid 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;

}

Page 27: Nesneye Dayal ı Programlama

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.

Page 28: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

#include <iostream>#include <cstring> // string fonksiyonlarý içinusing 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þtururString::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

}

Page 29: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Kurucu Fonksiyon// Parametre olarak aldýðý katarý nesnenin içeriðine kopyalarString::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ýrvoid 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];

}

Page 30: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Yok edici Fonksiyon// icerik tarafýndan isaret edilen bellek geri veriliyorString::~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ölgesis1(c,7); // 7 karakter kopyalandýc[7]='\0'; // Katar sonunu belirtmek için (null)cout << c << endl; // Kopyalanan karakterler ekrana yazýlýyordelete c; // Alýnan bellek bölgesi iade ediliyor

return 0; }

Page 31: Nesneye Dayal ı Programlama

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.

Page 32: Nesneye Dayal ı Programlama

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ı 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.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ýfclass 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;

};

Page 33: Nesneye Dayal ı Programlama

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ýyorreturn *this; // Nesnenin referansý döndürülüyor

}// Nesne ile ilgili bilgileri ekrana çýkaran metotvoid 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;

}

Page 34: Nesneye Dayal ı Programlama

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

Page 35: Nesneye Dayal ı Programlama

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.

Page 36: Nesneye Dayal ı Programlama

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ýfclass 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ýyorreturn *this; // Nesnenin referansý döndürülüyor

}

Page 37: Nesneye Dayal ı Programlama

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 metotvoid ComplexT::goster() const{

cout << "re=" << re << " im=" << im << endl;}

//---- Ana Program -----int main(){

ComplexT z1(1.2,0.5),z2;z2= ++z1; // operator ++() çalýþýrz1.goster();z2.goster();z2= z1++; // operator ++(int) çalýþýrz1.goster();z2.goster();return 0;

}

Page 38: Nesneye Dayal ı Programlama

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:

4 6 82 2 2

Page 39: Nesneye Dayal ı Programlama

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; cout<<w.count<<endl; } cout<<w.count<<endl; Widget y; cout<<w.count<<endl;}

Output:

2623

Page 40: Nesneye Dayal ı Programlama

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