Nesneye Dayali Programlama - PowerPoint PPT Presentation

About This Presentation
Title:

Nesneye Dayali Programlama

Description:

Nesneye Dayal Programlama DERS 4 Operat rlere Yeni levler Y klenmesi ( Operator Overloading) C++ da haz r olarak var olan operat rlere ... – PowerPoint PPT presentation

Number of Views:95
Avg rating:3.0/5.0
Slides: 41
Provided by: NAGE5
Category:

less

Transcript and Presenter's Notes

Title: Nesneye Dayali Programlama


1
Nesneye Dayali Programlama
  • DERS 4

2
Operatörlere Yeni Islevler Yüklenmesi ( Operator
Overloading)
  • Cda hazir olarak var olan operatörlere (, -,
    , / , ! , ltlt , vs.) iliskin fonksiyonlar
    yazarak bu operatörlerin sizin belirlediginiz
    islemleri yapmasini saglayabilirsiniz.
  • Operatör fonksiyonlari bir sinifin üyesi de
    olabilirler. Böylece o siniftan yaratilan
    nesneler üzerinde islemler yapan operatörler
    tanimlanmis olur.
  • Cda operatör kullanimi fonksiyon çagrilarina
    karsi düsmektedir.

3
  • Operatörlere yeni islevler yükleyerek
    yapilabilecek her sey normal fonksiyonlar ile de
    yapilabilir. Fonksiyon isimleri yerine
    operatörleri kullanmak programin yazilmasini ve
    okunmasini kolaylastirabilir.
  • Bu nedenle bir operatöre islev yüklemek, eger
    program daha kolay okunur ve anlasilir olacaksa
    tercih edilmelidir.

4
Sinirlamalar
  • Cda olmayan operatörlere islev yüklenemez.
    Örnegin üs alma islemi için simgesine ya da
    simgesine bir islev yüklenemez.
  • Cda var olan operatörlerden bazilarina da yeni
    islev yüklenemez. Bunlar nokta operatörü . ,
    yasam alani belirleme operatörü , kosul
    operatörü ? ve boyut operatörüdür sizeof .

5
  • C operatörleri birli ve ikili olmak üzere iki
    gruba ayrilabilir. Birli operatörler tek operand
    alirlar. Örnegin -a, a, !a . Ikili operatörler
    ise iki operand alirlar ab, a/b gibi.
  • Operatörlere islev yüklerken operand sayisi
    degistirilemez.
  • Operatörlerin öncelikleri degistirilemez.
  • Derleyicinin hazir veri tipleri üzerinde islem
    yapan operatörlere yeni islev yüklenemez. Örnegin
    iki tamsayiyi toplayan operatörü
    degistirilemez. Yeni olusturulan operatörlerin en
    az bir operandinin tipi bir sinif olmalidir.

6
Operatörüne Yeni Bir Islev Yüklenmesi
  • Asagidaki örnekte ComplexT sinifina operatörü
    için bir metot eklenecektir. Böylece
    operatörünün karmasik sayilari toplamasi
    saglanacaktir.

7
Örnek 1
  • class ComplexT // Karmasik (Kompleks) sayilari
    tanimlamak için olusturulan sinif
  • double re , im // reel ve sanal kisimlar
  • public
  • ComplexT(double re_in0, double im_in1) //
    Kurucu
  • ComplexT operator(const ComplexT ) const //
    operatörünün fonksiyonu
  • void goster() const
  • // operatörü
  • ComplexT ComplexToperator(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 // z3z1.operator(z2)

8
Atama Operatörüne Yeni Bir Islev Yüklenmesi
  • Atama islemi programlarda çok sik
    kullanildigindan C derleyicisi her sinifa atama
    operatörü için bir fonksiyon yerlestirir.
    Derleyicinin yerlestirdigi fonksiyon bir nesnenin
    verilerini var olan baska bir nesnenin veri
    alanlarina bire bir kopyalar.
  • Eger bu bire bir atama islemi o sinif için
    yeterli ise programcinin atama operatörü için bir
    fonksiyon yazmasina gerek kalmaz. Içinde isaretçi
    olmayan siniflar için genellikle derleyicinin
    sagladigi fonksiyon yeterlidir.

9
  • Örnegin karmasik sayilar için asagida gösterilen
    atama fonksiyonu gereksizdir.
  • void ComplexToperator(const ComplexT z) //
    Gereksiz
  • re z.re
  • im z.im
  • Bu fonksiyon yazilmasaydi derleyicinin
    yerlestirecegi fonksiyon da ayni isi yapardi.
  • Eger sinifta bir atama fonksiyonu varsa, artik
    derleyici tüm atama isleri için bu fonksiyonu
    kullanir.

10
Örnek 2
  • include ltiostreamgt
  • 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_in0,double im_in1)
    re(re_in),im(im_in)
  • // Kurucu (gövdesi boþ)
  • void operator(const ComplexT ) //
    Operatörü
  • void goster() const
  • // operatörü
  • void ComplexToperator(const ComplexT c)
  • re c.re // Atamalar yapýlýyor
  • im c.im
  • cout ltlt "Atama fonksiyonu calisti" ltlt endl //
    Çalýþtýðýný ekranda görnmek için

11
  • Ancak her sinif için derleyicinin sagladigi atama
    fonksiyonu yeterli olmayabilir.
  • Özellikle içinde isaretçi olan siniflarda
    programcinin atama operatörüne iliskin fonksiyonu
    yazmasi gerekebilir. Kopyalama kurucusundakine
    benzer bir problem burada da vardir. Asagida
    örnek String sinifi için atama fonksiyonu
    yazilmistir.

12
Örnek 3
  • class String // Örnek (karakter katari) String
    sinifi
  • int boy // Katarin boyu
  • char icerik // Katarin içerigi
  • public
  • String() // Parametresiz kurucu
  • String(const char ) // Kurucu
  • String(const String ) // Kopyalama kurucusu
  • void operator(const String ) // Atama
    operatörü
  • void goster() // Katarlari ekrana çikaran üye
    fonksiyon
  • String() // Yok edici fonksiyon
  • // Atama Operatörü
  • void Stringoperator(const String gelen_nesne)
  • coutltlt "Atama operatoru calisti" ltlt endl
  • boy gelen_nesne.boy
  • delete icerik // Eski içerik bellege iade
    ediliyor
  • icerik new charboy 1 // 1 null karakteri
    icin
  • strcpy(icerik, gelen_nesne.icerik)

13
Derleyicinin sagladigi fonksiyon
14
  • Eger operatör fonksiyonlarinin geri dönüs degeri
    tipleri void olarak yazilirsa bu operatörler pes
    pese baglanamaz.
  • Bir önceki örnekte gösterilen atama fonksiyonu
    geriye bir deger döndürmemektedir (void) . Bu
    nedenle bu operatörü kaskad olarak yazmak ( a b
    c gibi) mümkün degildir.
  • Operatörleri kaskad baglayabilmek için operatöre
    iliskin fonksiyon, üzerinde islem yapilan
    nesnenin referansini geri göndermelidir.

15
Örnek 4
  • include ltiostreamgt
  • include ltcstringgt // 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
  • StringString()

16
  • // Kurucu Fonksiyon
  • // Parametre olarak aldýðý katarý nesnenin
    içeriðine kopyalar
  • StringString(const char gelen_veri)
  • coutltlt "Kurucu calisti" ltlt endl
  • boy strlen(gelen_veri) // gelen katarýn
    boyu hesaplandý
  • icerik new charboy 1 // icerik için yer
    ayrýldý, 1 null icin
  • strcpy(icerik, gelen_veri) // gelen veri
    icerik'in gosterdigi yere kopyalanýyor
  • // Kopyalama kurucusu
  • StringString(const String gelen_nesne)
  • coutltlt "Kopyalama Kurucusu calisti" ltlt endl
  • boy gelen_nesne.boy
  • icerik new charboy 1 // 1 null
    karakteri icin
  • strcpy(icerik, gelen_nesne.icerik)

17
  • void Stringgoster()
  • coutltlt icerik ltlt ", " ltlt boy ltlt endl // Katar
    ve boyu ekrana yazýlýyor
  • // Yok edici Fonksiyon
  • // icerik tarafýndan isaret edilen bellek geri
    veriliyor
  • StringString()
  • coutltlt "Yok edici calisti" ltlt endl
  • delete icerik
  • //-------- Ana Program ----------------
  • int main() // Ana fonksiyon
  • String s1("Katar 1")
  • String s2 s1 // Kopyalama kurucusu çalýþýr
  • s2.goster()

18
Indis Operatörüne ( Subscript Operator) Yeni
Bir Islev Yüklenmesi
  • Tüm operatör fonksiyonlari için ayni kurallar
    geçerli oldugundan hepsini ayri ayri anlatmaya
    gerek yoktur. Ancak ilginç ve yararli olabilecek
    bazi operatörler açiklanmistir. Bunlardan biri de
    indis operatörüdür.
  • Bu operatöre iliskin fonksiyon iki farkli yapida
    olabilir
  • class C
  • dönüs tipi operator (parametre tipi)
  • ya da
  • const dönüs tipi operator (parametre tipi)
    const

19
  • Birinci yazim sekli, eger bu operatör ile
    nesnenin verileri degistirilecekse kullanilir. Bu
    durumda operatör bir atama operatörünün solunda
    yer alabilir. Ikinci yazim seklinde ise fonksiyon
    sabit olarak tanimlanmistir. Bu durumda operatör
    ile nesnenin verileri sadece okunabilir.
  • c bir nesne olmak üzere
  • ci ifadesi c.operator(i) anlamina gelir.

20
  • Indis operatörüne String sinifinda kullanilmak
    üzere bir islev yüklenecektir. Bu operatör bir
    katardaki i. karaktere erisilmesini
    saglayacaktir. Eger i sifirdan küçük verilirse
    katardaki ilk elemana, eger i katarin boyundan
    büyük verilirse katardaki son elemana erisilmis
    olacaktir.

21
Örnek 4
  • include ltiostreamgt
  • include ltcstringgt // 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

22
  • // Kurucu Fonksiyon
  • // Parametre olarak aldýðý katarý nesnenin
    içeriðine kopyalar
  • StringString(const char gelen_veri)
  • coutltlt "Kurucu calisti" ltlt endl
  • boy strlen(gelen_veri) // gelen katarýn
    boyu hesaplandý
  • icerik new charboy 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 Stringoperator(int i)
  • cout ltlt "Indis operatoru calisti" ltlt endl
  • if(i lt 0)
  • return icerik0 // Ýlk eleman gönderiliyor
  • if(i gt boy)
  • return icerikboy-1 // Son eleman
    gönderiliyor

23
  • void Stringgoster()
  • coutltlt icerik ltlt ", " ltlt boy ltlt endl // Katar
    ve boyu ekrana yazýlýyor
  • // Yok edici Fonksiyon
  • // icerik tarafýndan isaret edilen bellek geri
    veriliyor
  • StringString()
  • coutltlt "Yok edici calisti" ltlt endl
  • delete icerik
  • //-------- Ana Program ----------------
  • int main() // Ana fonksiyon
  • String s1("Katar 1")
  • s11 'X' // Katarýn 2. karakteri 'X' oldu
  • s1.goster()

24
Fonksiyon Çagirma ( Function Call ) Operatörüne
() Yeni Bir Islev Yüklenmesi
  • Bu operatörü digerlerinden ayiran özellik,
    operand sayisinin programci tarafindan
    belirlenebilmesidir.Bu operatöre iliskin
    fonksiyon asagidaki yapida olur
  • class C
  • dönüs tipi operator () (parametre tipleri)
  • c bir nesne olmak üzere
  • c(i,j,k) ifadesi c.operator()(i,j,k) anlamina
    gelir.

25
Örnek 5
  • include ltiostreamgt
  • 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_in0,double
    im_in0)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 ComplexToperator(const ComplexT c)
    const
  • double yeni_re, yeni_im
  • yeni_rerec.re
  • yeni_imimc.im

26
  • // () operatörü
  • // Nesne ile ilgili bilgileri ekrana yazar
  • void ComplexToperator()() const
  • cout ltlt "re" ltlt re ltlt " im" ltlt im ltlt endl
  • int main()
  • ComplexT z1(1,1),z2(2,2),z3
  • z1()
  • z2()
  • z3z1z2
  • z3()
  • return 0

27
Örnek 6
  • Bu örnekte ise fonksiyon çagirma operatörünün
    parametreli olarak kullanimi gösterilmistir.
  • Örnekteki operatör, bir karakter katarinin
    (String) istenen bir miktarini, istenen bir
    bellek bölgesine kopyalamaktadir.

28
  • include ltiostreamgt
  • include ltcstringgt // 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
  • StringString()
  • coutltlt "Parametresiz Kurucu calisti" ltlt endl

29
  • // Kurucu Fonksiyon
  • // Parametre olarak aldýðý katarý nesnenin
    içeriðine kopyalar
  • StringString(const char gelen_veri)
  • coutltlt "Kurucu calisti" ltlt endl
  • boy strlen(gelen_veri) // gelen katarýn
    boyu hesaplandý
  • icerik new charboy 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 Stringoperator()(char hedef, int sayi)
    const
  • if (sayigtboy) sayiboy // sayi katarýn
    boyundan uzunsa
  • for (int k0 klt sayi k) hedefk icerikk

30
  • // Yok edici Fonksiyon
  • // icerik tarafýndan isaret edilen bellek geri
    veriliyor
  • StringString()
  • coutltlt "Yok edici calisti" ltlt endl
  • delete icerik
  • //-------- Ana Program ----------------
  • int main() // Ana fonksiyon
  • String s1("Ornek Program")
  • char c new char8 // Hedef bellek bölgesi
  • s1(c,7) // 7 karakter kopyalandý
  • c7'\0' // Katar sonunu belirtmek için
    (null)
  • cout ltlt c ltlt endl // Kopyalanan karakterler
    ekrana yazýlýyor
  • delete c // Alýnan bellek bölgesi iade
    ediliyor
  • return 0

31
Bir Operandli (Unary) Operatörlere Yeni Bir Islev
Yüklenmesi
  • Birli operatörlere örnekler arttirma (),
    azaltma(--), eksileme(-5), mantiksal tümleme (!)
    vs.
  • Bu operatörlere iliskin fonksiyonlar bir sinifin
    üyesi olarak yazildiklarinda hiç parametre
    almazlar. Çünkü üzerinde çagirildiklari nesne
    üzerinde islem yaparlar. Bu operatörler normalde
    nesnen,n solunda yer alirlar !n, -n, n gibi.

32
Örnek 7
  • Asagidaki örnekte operatörüne, karmasik
    sayilarin reel kismini 0.1 arttirma islevi
    yüklenmistir.
  • include ltiostreamgt
  • 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_in0,double im_in1)
    re(re_in),im(im_in)
  • // Kurucu (gövdesi boþ)
  • const ComplexT operator( ) // Operatörü
  • void goster() const

33
  • // operatörü
  • // Karmaþýk sayýlarýn reel kýsmýný 0.1 kadar
    arttýrmaktadýr.
  • const ComplexT ComplexToperator()
  • rere0.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 ComplexTgoster() const
  • cout ltlt "re" ltlt re ltlt " im" ltlt im ltlt endl
  • //---- Ana Program -----
  • int main()
  • ComplexT z1(1.2,0.5),z2
  • z2 z1
  • z1.goster()

34
  • Bilindigi gibi ve operatörleri operandlarin
    hem soluna hem de sagina yazilabilirler.
  • Bir atama deyimi ile birlikte kullanildiklarinda
    operatörlerin yazilma sekli önemli olur. Buna
    göre önceden arttirma (azaltma) ya da sonradan
    arttirma (azaltma) anlamina gelirler.
  • z2 z1 // önceden arttirma
  • z2 z1 // sonradan arttirma

35
  • Operatör fonksiyonu operator() seklinde
    parametresiz olarak yazilirsa, önceden arttirma
    operatörüne bir islev yüklenmis olur. Sonradan
    arttirma operatörüne bir islev yüklemek için
    fonksiyon bir parametreli olarak yazilir
    operator(int). Buradaki parametrenin amaci
    sadece iki fonksiyonu birbirinden ayirmaktir.
    Fonksiyon çagrilirken herhangi bir parametre
    gönderilmez.

36
Örnek 8
  • include ltiostreamgt
  • 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_in0,double im_in1)
    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 ComplexToperator()
  • rere0.1 // reel kýsým arttýrýlýyor

37
  • // Sonradan arttýrma operatörü
  • // Karmaþýk sayýlarýn reel kýsmýný 0.1 kadar
    arttýrmaktadýr.
  • ComplexT ComplexToperator(int) //
    sonradan arttýrma operatörü
  • ComplexT gecici
  • gecici this // nesnenin orijinal
    deðeri
  • rere0.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 ComplexTgoster() const
  • cout ltlt "re" ltlt re ltlt " im" ltlt im ltlt endl
  • //---- Ana Program -----
  • int main()

38
Karisik Örnekler
  • includeltiostreamgt
  • using namespace std
  • class Point
  • private
  • double x,y,z
  • public
  • Point()x0y0z0
  • Point(double x_arg, double y_arg, double
    z_arg0)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 PointAdd(const Point p)
  • return Point (xp.xa(),yp.ya(),zp.za())
  • Output
  • 6 8
  • 2 2 2

39
  • includeltiostreamgt
  • using namespace std
  • class Widget
  • publicWidget()count
  • Widget()--count
  • static int count
  • int Widgetcount0
  • main()
  • Widget w,x
  • coutltltw.countltltendl
  • Widget w,x,y,z
  • coutltltw.countltltendl

Output 2 6 2 3
40
Sinif Yapisinin Sagladiklari
  • Modelleme kolayligi
  • Kolay okunur ve anlasilir programlar
  • Özel verilerin korunmasi
  • Hatalarin yöresel kalmasi
  • Grup çalismalarinda kolaylik
  • Yeni veri tipleri yaratma yetenegi
Write a Comment
User Comments (0)
About PowerShow.com