Download - Nesneye Dayal ı Programlama
![Page 1: Nesneye Dayal ı Programlama](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/1.jpg)
Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli
Nesneye Dayalı Programlama
DERS 4
![Page 2: Nesneye Dayal ı Programlama](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/13.jpg)
Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli
Derleyicinin sağladığı fonksiyon:
![Page 14: Nesneye Dayal ı Programlama](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.pub/reader036/viewer/2022081504/56815050550346895dbe4eab/html5/thumbnails/40.jpg)
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