c++ e-kitap

Upload: 123142asdad

Post on 04-Apr-2018

226 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/29/2019 C++ E-Kitap

    1/101

    C++ NASIL BR PROGRAMLAMA DLDR?

    C++ nesne ynelimli programlama tekniinin uygulanabilmesi iinC'nin geniletilmi bir biimidir. Nesne ynelimli programlama(objectoriented programming) teknii ve C++ B.Stroustroup tarafndan

    gelitirilmitir. Tasarm 70'li yllarn ikinci yarsndan balanm olsa dabtn dnyada yaygnlamas ve kabul grmesi 80'li yllarn sonlarnadoru mmkm olmutur. Nesne ynelimli programlama teknii(NYP)zellikle byk kodlarn stesinden gelebilmek amacyla tasarlanmtr.

    Tasarm C++ zerinde yaplm olmasna karn bugn pek ok yksekseviyeli programlama dilleri bu teknii desteklemektedir. C++ ve nesneynelimli programlama tekniinin en belirgin uygulama alanlarndan birisiWINDOWS altnda programlamadr. WINDOWS karmak ve yksek yksekseviyeli bir iletim sistemidir. WINDOWS altnda program gelitirebilmekiin uzun kodlar yazmak gerekir. Bu nedenle WINDOWS altnda C ile deilC++ ile ve NYP tekniini kullanarak program yazmak daha etkin birzmdr. NYP tekniinin uygulanabilmesi iin altmz sisteminkaynaklarnn yeterince geni olmas gerekir. (Yani hzl bir mikro ilemci,byk RAM ve DISK ve iyi bir iletim sistemi)

    C++'IN C'DEN FARKLILIKLARI

    NYPT LE DORUDAN SINIF YAPISI

    LKS OLMAYANFARLILIKLARI VEFAZLALIKLARI

    ki dzeyde deerlendirilebilir.1-)NYPT ile dorudan ilikisi olayan farkllklar ve fazlalklar2-)Snf yaps

    Snf(class) C'deki yap(struct)'lara benzer bir veri yapsdr. NYPTsnflar kullanlarak program yazlmas tekniidir. Kursun %80'i snfyapsnn yaps ve kullanlmas zerine ayrlmtr.

    C++'IN NYPT LE DORUDAN LKS OLMAYAN FARLILIKLARI VEFAZLALIKLARI

    C++ derleyicileri C derleyicisini de iermek zorundadr. Yani C++derleyicisi demek hem C hem de C++ derleyicisi demektir. Derleyicidosyann uzantsna bakarak kodun C'de mi yoksa C++'ta m yazlmolduuna karar verir. C'de ise uzants c, C++'ta yazlmsa uzantscpp'dir.

    1-) C++'ta yerel deikenlerin bildirimleri bloklarn banda yaplmakzorunda deildir.

    1

  • 7/29/2019 C++ E-Kitap

    2/101

    Standart C'de yerel deikenler bloklarn banda bildirilmek zorundadr.Yani kme parantezi aldktan sonra daha hibir fonksiyon arlmadanve ilem yaplmadan yaplmaldr. Bu tasarmn nedeni programcnnbildirimin yerini kolay bulabilmesini salamaya yneliktir. Oysa C++'taterel deiklenler bloun herhangi bir yerinde bildirilebilir. Bir deikenin

    kullanma yakn bir blgede bildirilmesi C++ tasarmclarna gre dahaokunabilirdir. (Deiken kavram nesne isimlerini, struct, union ve enumisimlerini ve enum sabitlerini, typedef isimlerini ieren genel bir terimdir.)O halde C++'ta yerel deikenin faaliyet alan bildirim noktasndan bloksonuna kadar olan blgeyi kapsar. Ne olursa olsun bir blok ierisinde aynisimli birden fazla deiken bildirimi yaplamaz.

    C++da for dngsnn birinci ksmnda bildirim yaplabilir. rnekolarak:

    for(int i = 0,j = 20; i + j < 50; ...){ }

    Tabii while dngsnn ve if deyiminin ierisinde bildirim yaplamaz.

    #include #define SIZE 100

    void main(void){

    for(int i = 0; i < SIZE; ++i)printf("%d\n", i);

    }Byle for dngsnn ierisinde bildirilmi deikenlerin faaliyet alanlar

    bildirildii yerden for dngsnn iinde bulunduu bloun sonuna kadaretkilidir. if, for, switch, while gibi deyimlerden sonra blok almam olsabile gizli bir bloun ald dnlmelidir.

    {for (int i = 0; i < 100; ++i) {

    for (int j = 0; j < 100; ++j) {}

    printf(%d\n, j); /*geerli*/}printf(%d\n ,i); /*geerli*/printf(%d\n, j); /*geersiz*/

    }

    {for (int i = 0; i < 100; ++i)

    for (int j = 0; j < 100; ++j) {}

    j = 10; /*geersiz*/

    i = 10; /*geerli*/}

    2

  • 7/29/2019 C++ E-Kitap

    3/101

    2-) C++ta // ile satr sonuna kadar yorumlama yaplabilir.

    C++ta /* */ yorumlama biiminin yan sra kolaylk olsun diye // ilesatr sonuna kadar yorumlama biimi de eklenmitir. Son senelerde byle

    bir yorumlama biimi standart Cde de kullanlmaya balanmtr. AncakANSI C standartlarnda tanml deildir. Tanabilirlik bakmndan buyorumlama biimini standart Cde kullanmak tavsiye edilmez.

    3-)C++ta arlan fonksiyon eer aran fonksiyonun yukarsndatanmlanmamsa fonksiyon prototipi zorunludur.

    C de bir fonksiyonun arldn gren derleyici fonksiyonun arlmanoktasna kadar fonksiyonun tanmlamasyla ya da prototipi ilekarlamamsa geri dn deerini int olarak varsayar ve kod retir.Dolaysyla aadaki rnek Cde geerlidir.

    void main(void){

    int x;

    x = fonk();}

    int fonk() /*Bu durum Cde sorun olmaz ama C++ta error verir.*/{

    }

    Oysa C++ta derleyicinin arlma noktasna kadar fonksiyonuntanmlamasyla ya da prototipiyle karlamas gerekir. Dolaysylayukardaki kod C++ta errordr. (NOT: CV++ ve nesne ynelimliprogramlama teknii bug oluturabilecek kodlardan kanlmas temelinedayandrlmtr. Yani garanti yntemler kullanlmaldr. Bu sebeple Cdekipek ok uyar C++ta errore dntrlmtr.)

    4-) C++ta farkl parametre yaplarna sahip ayn isimli birden fazlafonksiyon tanmlanabilir.

    void fonk(void){}

    void fonk(int x){}

    Cde ne olursa olsun ayn isimli birden fazla fonksiyon tanmlanamaz. Oysa

    3

  • 7/29/2019 C++ E-Kitap

    4/101

    C++ta parametre yaps sayca ve/veya trce farkl olan ayn isimli birdenfazla fonksiyon tanmlanabilir. Ayn isimli birden fazla fonksiyon varsa ve ofonksiyon arlmsa gerekte hangi fonksiyon arlm olduuarlma ifadesindeki parametre yaps incelenerek belirlenir. Yaniarlma ifadesindeki parametre says ve tr hangisine uygunsa o

    arlm olur. Geri dn deerinin farkl olmas ayn isimli fonksiyonyazmak iin yeterli deildir. Yani geri dn deerleri farkl fakatparametre yaps ayn olan birden fazla fonksiyon tanmlanamaz.

    #include

    void fonk(int x){

    printf("int = %d\n", x);}

    void fonk(long x){

    printf("long = %ld\n", x);}

    void fonk(void){

    printf("void\n");}

    void fonk(char *str){

    puts(str);}

    void main(void){

    fonk(); /*parametresi void olan fonksiyonu arr*/fonk(10); /*parametresi int olan fonksiyonu arr*/fonk(100L); /*parametresi long olan fonksiyonu arr*/

    fonk(merhaba); /*parametresi karakter trnden gsterici olan

    fonksiyonu arr*/}

    K ANLAMLILIK HATASI

    C++ta pek ok durumda derleyicinin birden ok seenek arasnda kararverememesinden dolay error durumuyla karlalr. Bu tr hatalara ikianlamllk hatalar denir. Yukardaki rnekte fonk(3.2); gibi bir armayaplrsa Ambiguity between 'fonk(int)' and 'fonk(long)' hatasn verir.Ayn isimli birden fazla fonksiyon arasnda seme ilemi ancak parametresaylar alma ifadesine uygun birden fazla fonksiyon varsa gerekleir.

    Parametre says arlma ifadesine uygun tek bir fonksiyon varsa budurumda tr uyumasna baklmaz. Cde olduu gibi otomatik tr

    4

  • 7/29/2019 C++ E-Kitap

    5/101

    dntrmesi yaplarak o fonksiyon arlr.

    C++ derleyicisi ayn sayda parametrelere sahip birden fazla ayn isimlifonksiyonun bulunmas durumunda arlma ifadesine tr bakmndanuygun bir fonksiyon bulamazsa bu durum iki anlamllk hatasna yol aar.

    Bu durumun 3 istisnas vardr:

    1. Fonksiyon char ya da short parametreyle arlmsa char ya da shortint parametreye sahip bir fonksiyon yok ancak int parametreye sahipbir fonksiyon varsa int parametreye sahip olan fonksiyon arlr.

    2. Fonksiyon float parametreyle arlmsa ancak float parametreyesahip bir fonksiyon yok double parametreye sahip bir fonksiyontanmlanmsa bu durumda double parametreye sahip olan fonksiyonarlr.

    3. Fonksiyon ayn trden const olmayan bir ifadeyle arlmsa ancakayn trden const parametreye sahip bir fonksiyon y,tanmlanmsa truyuumunun saland kabul edilir ve const parametreye sahip olanfonksiyon arlr.

    Cde ve C++ta tanmlanan ve arlan bir fonksiyon ismi .obj modlierisine yazlmak zorundadr. .obj modl standardna gre ayn isimlibirden ok fonksiyon modl ierisine yazlamaz. Standart C derleyicilerifonksiyon isimlerinin bana bir _ ekleyerek obj modln ierisine yazarlar.Oysa C++ derleyicileri fonksiyon isimlerini parametre trleriyle kombineederek obj modl ierisine yazarlar. Bu durumda C++ta ayn isimli farklparametrelere sahip fonksiyonlar sanki farkl isimlere sahiplermi gibi obj

    modle yazlrlar.5-) extern C ve extern C++ bildirimleri

    C++ta normal olarak btn standart C fonksiyonlar arlabilir. StandartC fonksiyonlar lib dosyalarnn ierisine banda _ bulunarak yanistandart C kurallaryla yazlmlardr. Oysa bu fonksiyonlarn C++tanarlmasyla bir uyumsuzluk ortaya kar. nk C++ derleyicisi arlanfonksiyonu obj modl ierisine bana _ koyarak deil parametretrleriyle kombine ederek yani C++ kurallaryla yazar. extern C bildirimibir fonksiyonun prototipinin nne ya da bir fonksiyonun tanmlamasnn

    nne getirilirse /*rnein:

    extern C double sqrt(double);

    veya

    extern C void fonk(void){.........}*/

    derleyici bu fonksiyonu obj modl ierisine C kurallaryla yani bana _koyarak yazar. Bylece Cde yazlm olan C++tan kullanlmas mmkn

    5

  • 7/29/2019 C++ E-Kitap

    6/101

    Fonksiyon prototipleri

    olur. Bir grup fonksiyon yazm kolayl salamak iin extern C blouiine alnabilir.

    extern C {void fonk(void);

    void sample(void);....

    }

    Bloun ierisinde baka bildirimler ve kodlar bulunabilir. Ancak derleyiciyalnzca bu bloun ierisindeki fonksiyonlarla ilgilenir. Bu durumdastandart C balk dosyalarnn ierisinde fonksiyonlarn extern Cbildirimiyle prototipleri yazlm olmas gerekir. Ayn dosya hem C hem C++ta include edilip kullanlabildiine gre ve extern C bildirimi sadece C++ iin geerliyse bir problem ortaya kmaz m? Bu problem ncedentanmlanm cplusplus sembolik sabitiyle zmlenmitir:

    #ifdef cplusplusextern C {#endif..............................#ifdef cplusplus}#endif

    Bir de extern C++ bildirimi vardr. Bu bildirim fonksiyon isimlerinin C++kurallarna gre obj modln ierisine yazlacan anlatr. Zatenfonksiyonlar default olarak bu kurala gre yazlrlar. Bu bildirim ileriyedoru uyumu salamak iin dnlmtr. u anda bir kullanmgerekesi yoktur.

    6-) C++ta dinamik bellek ynetimi new ve delete isimli iki operatrle yaplr.

    Mademki C++ ierisinde btn standart C fonksiyonlar kullanlabiliyor, ohalde dinamik bellek ynetimi malloc, claloc, realloc ve freefonksiyonlaryla yaplabilir. Ancak bu fonksiyonlar nesne ynelimliprogramlama tekniini uygulayabilmek iin tasarlanmamtr. Bu yzdenC++ta yeni bir teknik kullanlmaktadr. C++ta dinamik olarak tahsisedilme potansiyelindeki bo blgelere free store denilmektedir(standartCde heap denir).

    new Operatr

    Genel biimi:

    6

  • 7/29/2019 C++ E-Kitap

    7/101

    new []

    new intnew charnew double [10]

    new float[n]new char[strlen(s) + 1]

    Eer keli parantez olmadan sadece tr ismi ile tahsisat yaplrsa o trdenbir elemanlk yer tahsis edilmi olur. rnein:

    new int1 intlik yer tahsis edilmitir.

    Eer keli parantez ierisine ifade yazlarak kullanlrsa bu durumda oifade ile belirtilen sayda elemanlk alan tahsis edilir. new operatr trbelirli bir alan tahsis eder. Yani new operatryle elde edilen adresin trbileeni arlma ifadesindeki tr ile ayn olur.

    int *p;p = new int; /* Burada sizeof(int) kadar byte tahsis ediliyor ve

    tahsis edilen */ /* alann balang adresi eldeediliyor. Bu adres int trndedndir.*/

    char *p;p = new int [10]; /* C++ta hatadr. */p = (char *)new int[10]; /* Hata deil. */

    /*----------new1.cpp---------*/#include #include

    void main(void){

    char *p;

    p = new char[30];gets(p);

    puts(p);}/*------------------------------*/

    New bir operatrdr. Ancak derleyici bu operatr kullanldnda dinamiktahsisat ileminin yaplmasn salamak iin dinamik tahsisat yapan birfonksiyonun arma kodunu ama koda ekler. Yani new bir operatrolmasna karn tahsisat ilemi yerletirilen bu fonksiyon sayesindeprogramn alma zaman srasnda yaplmaktadr. Bu operatr nceliktablosunun ikinci dzeyinde bulunmaktadr. rnein:new int + n

    gibi bir ilem geerlidir. lemler:lem 1 : new int

    7

  • 7/29/2019 C++ E-Kitap

    8/101

    lem 2 : lem 1 + n

    New operatr tahsisat ilemini yapamazsa 0 deerini(NULL gsterici)retir.

    /*-------freestor.cpp------*//*free store alannn hesaplanmas*/#include

    #define BLOCKSIZE 1024

    void main(void){

    long size = 0;char *p;

    for(;;){p = new char[BLOCKSIZE];if(p == NULL)

    break;size += BLOCKSIZE;

    }printf("Free store size = %ld\n", size);

    }/*---------------------------*/

    Keli parantez ierisine yazlan ifade sabit ifadesi olmak zorunda deildir.

    /*-----------new2.cpp---------*//*Tam olarak ad sosay uzunluu kadar bellek tahsis eden fonksiyonunkullanl*/#include #include

    char *getname(void){

    char *p;

    char buf[80];

    printf("Ad Soyad:);gets(buf);p = new char[strlen(buf) + 1)];if(p == NULL){

    printf("Cannot allocate memory..\n");exit(1);

    }strcpy(p, buf);return p;

    }

    8

  • 7/29/2019 C++ E-Kitap

    9/101

    void main(void){char *p;

    p = getname();

    puts(p);}/*--------------------------------*/

    delete OPERATR

    Delete operatr new operatryle tahsis edilmi olan bloklar serbestbrakmak iin kullanlr. Genel biimi:

    1. delete p;2. delete [] p;

    Eer tahsisat tek para olarak yaplmsa yani keli parantezkullanlmadan yaplmsa silme ilemi keli parantez kullanlmadanyaplmaldr. rnein:

    int *p;p = new int;delete p;

    Eer tahsisat ilemi birden fazla eleman iin yaplmsa yani keliparantez kullanlarak yaplmsa serbest brakma ileminde de keliparantez kullanlmaldr. rnein:

    int *p;p = new int[n];delete [] p;

    Burada keli parantez ierisine bir ey yazlmaz. delete operatr unaryprefix bir operatrdr ve ncelik tablosunun ikinci dzeyinde bulunur.

    delete p + 1; /*Hatal*/

    delete (p + 1);/*Doru*/Delete operatrnn operand daha nce tahsis edilmi olan blounbalang adresi olmaldr. Deilse beklenmeyen sonular ortaya kabilir.

    Tabii derleici delete operatrne karlk ama koda (object modulee) freegibi tahsis edilmi blou serbest brakan bir fonksiyon koduyerletirmektedir. new delete operatrlerinin tahsisat ilemlerindekulland fonksiyon maloc, calloc, free fonksiyonlar olmak zorundadeildir. Bu iki grup fonksiyon farkl tahsisat tablolar kullanyor olabilir. Bunedenle new delete operatrleriyle malloc, calloc, free gibi standart Cfonksiyonlarn zel bir durum yoksa birlikte kullanmamak gerekir. nk

    bir grup tarafndan tahsis edilen alan dier grup tarafndan tahsisedilmemi gibi gzkebilir.

    9

  • 7/29/2019 C++ E-Kitap

    10/101

    Grld gibi C++ta realloc fonksiyonun karl bir operatr yoktur.Ancak byle bir fonksiyon yazlabilir.

    /*------------realloc.cpp---------------*/

    void *Realloc(void *ptr, size_t newsize, size_t oldsize) /*size_tunsigned int*/{

    void temp;

    temp = new char [newsize];memcpy(temp, ptr, oldsize);delete [] ptr;return temp;

    }/*----------------------------------------*/

    Kullanm:p = new char [10]; /* 10 * sizeof(char) kadar bellek tahsis edildi */p = Realloc(p, 20, 10); /* Tahsis edilmi alan 20 * sizeof(char)ebytld */

    set_new_handler FONKSYONU

    Normal olarak new oparetr baarszlkla sonulandnda 0 adresine geri

    dner ve bu adresin test edilmesi gerekir. Ancak her new kullanmnda buadresin test edilmesi yerine daha etkin bir yntem kullanlmaktadr. newoperatr baarsz olduunda set_new_handler fonksiyonu ile belirlenenfonksiyonu armaktadr. Bylece her defasnda kontrol yaplmasnagerek kalmaz.

    set_new_handler(void (*ptr)(void));

    set_new_handlera parametre olarak geri dn deeri void parametresi voidolan bir fonksiyonun adresi verilir. Artk baarszlk durumunda bufonksiyon arlacaktr. new operatr baarszlk durumunda belirlenen

    fonksiyonu arr ve bu fonksiyon arldktan sonra tekrar tahsisatilemini yapar. Yine baarsz olursa tekrar fonksiyonu arr ve bu byledevam eder. Yani aadaki algoritmadaki gib alr:for(;;){

    if(boyer var m)return boyer;

    elseset_new_handler();

    }

    /*-----------snhandle.cpp---------------*/

    #include #include

    10

  • 7/29/2019 C++ E-Kitap

    11/101

    #include

    long size = 0;

    void myhandler(void)

    {printf("Free store size=%ld\n", size);exit(1);

    }void main(void){

    void *ptr;void *oldhandler;

    oldhandler = set_new_handler(myhandler);for(;;){

    ptr = new char [1024];size += 1024;

    }}sen_new_handler(oldhandle);/*handler eski haline dntrld*//*------------------------------------------*/

    set_new_handlern prototipi new.h iindedir.

    7-) Bir adresin farkl trden bir gstericiye atanmas ve adres olmayan birbilginin bir gstericiye atanmas durumu uyar deil error olarakdeerlendirilir.

    Adres ilemlerinde tr uyumazlklar C++ta eror olarak deerlendirilir.Oysa standart C derleyicileri byle durumlarda en fazla uyar verirler.Ancak void gstericiye herhangi bir trden adres atanabilir. Fakat void biadresin herhangi bir gstericiye atanmas error olarak deerlendirlir(budurum Cde en fazla uyar olaak deerlendilir). Tabii tr dntrmeoperatryle her tr her tre atanabilir.

    /*----------fark7.cpp----------*/void main(void){

    int s[100];char *t;

    t = s; /* Cannot convert 'int *' to 'char *' hatasn verir*/

    t = (char *)s; /* Hata vermez */}/*--------------------------------*/

    Benzer biimde const bir deikenin adresi ancak const bir gstericiye

    11

  • 7/29/2019 C++ E-Kitap

    12/101

    atanmaldr.

    const int x;int *y;conts int *p;

    y= &x; /* Hata verir */p = &x; /* Hata vermez */

    8-) const bildirimi ile yaratlm bir deiken sabit ifadesi gibi ilem grr.

    C++ta const bir deiken iin yine bellekte yer ayrlr. Ancak constdeiken kullanldnda derleyici eer const deikene ilk deer sabitifadesiyle verildiyse derleyici dorudan o sabit ifadesini kullanr. Tabiiconst deikene verilen ilk deer sabit ifadesi deilse bu consta deikenkullanldnda derleyici dorudan bir say yerletiremez, const deikeninkendisini yerletirir.

    const int MAX = a + 100;const int MIN = 1;y = MAX; /* Burada bir say yazamaz */y = MIN; /* Burada MIN yerine 1 yazlabilir */const int SIZE = 10;int a[SIZE]; /* C++ta geerli Cde geerli deil */

    Const deiken iin yine de bellkte yer ayrlr. Bu durumda constdeikenin adresi alnabilir. Bu yolla const deikenin ierii de

    deitirilebilir. Tabii bu deitirme programn alma zaman ierisindeolduundan sonucu deitirmez.

    /*----------fark8.cpp------------*/#include

    void main(void){

    const int SIZE = 10;int *p;

    p = (int *)&SIZE;*p = 20;printf("%d\n", SIZE);

    }/*--------------------------------*/

    9-) C++ta statik mrl deikenlere sabit ifadesiyle ilk deer vermezorunluluu yoktur.

    Global deikenler ve statik yerel deikenler gibi statik mrldeikenlere ilk deer Cde sabit ifadesiyle verilmek zorundadr. nk

    statik mrl deikenler ama kod ierisine ilk deerleriyle yazlrlar. Exedosyasnn ierisinde yer alrlar. Bunun mmkn olabilmesi iin verilen ilk

    12

  • 7/29/2019 C++ E-Kitap

    13/101

    deerlerin derleme aamasnda belirlenmi olmas gerekir. Derlemeaamasnda tespit edilmesi iin ifadenin sabit ifadesi olmas gerekir. OysaC++ta statik mrl deikenlere her trden sradan bir ifadeyle ilk deerverilebilir. Bu deikenler 0 ilk deeriyle ama koda yazlrlar. Programnalma zaman srasnda ve main fonksiyonundan nce ilk deerini alrlar.

    10-) Parametre deikenlerinin default deerler almas(default functionarguments)

    C++ta fonksiyon arlrken bir parametre belirtilmemise ona ilikinparametre deikeni default bir deer alabilir. Byle bir durum Cdeyoktur. Bir parametre deikeninin default deer almas durumu fonksiyontanmlanrken ya da prototip bildiriminde paramere deikeninden sonraeittir operatryle belirtilmelidir.

    /*---------fark10.cpp----------*/#include

    void fonk(int x = 10, int y = 20){

    printf("x = %d y = %d\n", x ,y);}

    void main(void){

    fonk(100, 200); /* x = 100 y = 200 */

    fonk(100); /* x = 100 y = 20 */fonk(); /* x = 10 y = 20 */}/*--------------------------------*/

    Bir parametre deikeni default deer almsa onun sanda bulunanlarnhepsi default deerler almak zorundadr.

    void fonk(int x = 10, int y) /* Hata verir */{}

    void fonk(int x, int y = 20) /* Hata vermez */{}

    Default deer almam olan btn parametre deikenleri iin arlmaifadesinde parametre yazlmak zorundadr. Default deer alan parametredeikenlerine sahip fonksiyonlarla ayn isimli baka fonksiyonlarn birliktebulunmas durumunda iki anlamllk hatalar oluabilir. ki anlamllkhatalar fonksiyonlarn tanmlanmas sonucunda deil arlmassonucunda ortaya kmaktadr.

    /* ki anlamllk hatas rnei */

    13

  • 7/29/2019 C++ E-Kitap

    14/101

    #include

    void fonk(int x, int y = 20){

    printf("%d %d\n", x, y);

    }

    void fonk(int x){

    printf("%d\n", x);}

    void main(void){

    fonk(100, 200); /* Hata vermez */fonk(100); /* ki anlamllk hatas verir */

    }/*------------------------------------------*/

    Bir gsterici parametresi de default deer alabilir.

    /* Gstericiye default deer */#include

    void message(const char *p = "Success"){

    puts(p);}

    void main(void){

    char *p = "Ali";

    message(p);message();

    }/*-------------------------------------------*/

    Default Parametre Deikenlerine Sahip FonksiyonlarnKullanlma Nedenleri

    ok sayda parametrelere sahip fonksiyonlar sz konusu ise ve buparametre deikenlerinin belli blmne arma srasnda ayn deerleratanyorsa default parametre deikenlerinin kullanlmas byk bir yazmkolayl salar. Fazla sayda parametrenin yazlmamas hem programcnni ykn azaltr, hem de okunabilirlii arttrr.

    #include

    #include void *myitoa(int n, char *str, int base = 10)

    14

  • 7/29/2019 C++ E-Kitap

    15/101

    {return itoa(n, str, base);

    }

    void main(void)

    {char s[100];

    myitoa(123, s);puts(s);

    }

    Default deer alan parametre deikeni kullanlrken dikkat etmek gerekir.Bir fonksiyon % 90 ayn parametre deerleriyle arlyorsa defaultparametre deikeni kullanlmaldr. Hibir deer almayacana bari udeeri alsn fikriyle kullanlmamaldr. Bylesi kullanmlar kodu inceleyen

    kiiyi yanltrlar. Bazen parametre deikenine verilen default deerin zelbir anlam olmaz. Bu default deer fonksiyonun default parametreylearlp arlmadn tespit etmek amacyla kullanlr. Gerek defaultdeerler fonksiyonun ierisinde ve bir dizi ilemlerle elde edilir. rnein

    #define DEFAULT_CALL (-1)

    void writefile(void *ptr, unsigned size, long offset = DEFAULT_CALL){

    if(offset != DEFAULT_CALL)fseek(fp, offset, SEEK_SET);

    fwrite(ptr, 1, size, fp);}

    void main(void){

    double x = 10.2;

    writefile(&x, sizeof(double));}

    Default Deer Alan Parametre Deikenlerine SahipFonksiyonlarn Prototipleri

    Byle fonksiyonlarn prototiplerinde dafault parametre deerleribelirtilmelidir. Prototip yazma ilemi deiken isimlerini kullanarak ya dakullanmayarak yaplabilir. rnein aadaki iki prototip de geerlidir.

    void sample(int = 10, int = 20);void sample(int a = 10, int b = 20);

    Prototipi yazlan fonksiyon ayn modl ierisinde tanmlanyorsa(yani

    ktphane ierisinde deilse) tanmlama srasnda bir daha bu defaultdeerler yazlamaz. Yani default deerler ya prototipte ya da tanmlama

    15

  • 7/29/2019 C++ E-Kitap

    16/101

    srasnda belirtilmek zorundadr. Her ikisinde birden belirtilemezler.Tavsiye ediln kullanm prototipte belirtilmesi, tanmlama dabelirtilmemesidir.

    void sample(int x = 10, int y = 20);

    void sample(int x =10, int y = 20) /* Hata verir */{}

    void sample(int x, int y) /* Hata vermez */{}

    11-)C++ta gstericilere benzeyen ve ismine referans denilen ayr bir trvardr.

    Referans Trnden Bir Gstericinin Tanmlanmas

    Genel biimi:

    & =

    rnek:

    int a = 10;int &b = a;

    double x;..........double &y = x;

    Bir referans ilk deer verilerek tanmlanmak zorundadr. rnein:

    int &r; /* hata */

    double &r = 10.2; /* hata */

    Referansa verilen ilk deer ayn trden bir nesne olmak zorundadr.

    double x = 10 ;int &r = x; /* Hata. Farkl trden bir nesneyle ilk deer verilmi. */int &r = a; /* Okunuu: r int trnden bir referanstr */

    Referanslar bir eit dzeyi yksek gstericidir. Referanslarn ierisindeadres bilgisi bulunur. Derleyici bir referans tanmlandnda ilk deerolarak verilen nesnenin adresini referansn ierisine yerletirir. Referanslar

    iyi anlayabilmek iin onlarn edeer gsterici karlklarn dnmekgerekir. E deer gsterici karl referans yerine gsterici kullanldnda

    16

  • 7/29/2019 C++ E-Kitap

    17/101

    elde edilecek e deer kod anlamna gelir.

    int a = 10;int &b = a;

    Edeer karl:

    int a = 10;int *b = &a;

    Bir referans ilk deer verildikten sonra kullanldnda artk referansierisindeki adres deil referans ierisindeki adreste bulunan bilgi temsiledilir.

    /*----------fark11.cpp--------------*/

    #include

    #if 1

    void main(void) /* referans kullanm */{

    int a = 10;int &b = a;

    b = 50;printf("%d %d\n", b, a);

    }

    #endif

    #if 0

    void main(void) /* referansn gsterici karl */{

    int a = 10;int *b = &a;

    *b = 50;printf("%d %d\n", *b, a);

    }

    #endif

    /*-------------------------------------*/

    17

  • 7/29/2019 C++ E-Kitap

    18/101

    int a = 10;int &b = &a; /* Hata: &a int trnden deil adres trndendir

    */

    Referanslarn Fonksiyon Parametresi Olarak Kullanlmas

    Referanslar fonksiyon parametresi olarak kullanlabilirler. Madem ki birreferans ayn trden bir nesneyle ilk deer verilerek tanmlanmakzorundadr, o halde parametresi referans olan fonksiyonlar ayn trden birnesnenin kendisiyle arlmak zorundadr.

    /* fonksiyon parametresi olan referans rnei */

    #include

    #if 1 /* parametresi referans */

    void fonk(int &a){

    a = 20;}

    void main(void){

    int x = 10;

    fonk(x);printf("%d\n", x);

    }#endif

    #if 0 /* gsterici karl */void fonk(int *a){

    *a = 20;}

    void main(void)

    { int x = 10;

    fonk(&x);printf("%d\n", x);

    }#endif/*------------------------------------------------------------*/

    Bir C programnda fonk(a) gibi bir arma ilemiyle a deitirilemez. OysaC++ta byle bir arma fonksiyonun parametre deikeni bir referans ise

    a paametresini deitirebilir. Klasik bir C bak asyla parametre olanann deitirilmeyecei sanlabilir. Okunabilirlii kuvvetlendirmek iin eer

    18

  • 7/29/2019 C++ E-Kitap

    19/101

    parametreyi deitirecek bir fonksiyon tasarlanacaksa bunun iin referansdeil gsterici kullanlmaldr. Fonksiyonun parametre deikeni referansise derleyici tarafndan otomatik olarak yaplan bir adres aktarm szkonusudur.

    Referansuygulamas Gsterici edeeri

    int a = 10;int &r1 = a;int &r2 = r1;

    r2 = 20;printf(%d\n, r1);

    int a = 10;int *r1 = &a;int r2 = &r1;

    *r2 = 20;printf(%d\n, *r1);

    /*-----referans.cpp-----*/#include

    #if 1 /* referans rnei */

    void main(void){

    int a = 10;int &a1 = a;int &a2 = a1;

    a2 = 20;printf("%d\n", a1);

    }

    #endif

    #if 0 /*gsterici edeeri */

    void main(void){

    int a = 10;int *a1 = &a;

    int *a2 = a1;

    *a2 = 20;printf("%d\n", *a1);

    }

    #endif/*-------------------------*/

    /*-----referan1.cpp-----*/#include

    void main(void)

    19

  • 7/29/2019 C++ E-Kitap

    20/101

    {int a = 10;int &b = a;

    printf("%p %p\n", &a, &b);}/*--------------------------*/

    Bir referans & operatryle adres alma ilemine sokulabilir. Bu durumda eldeedilen deer referans ierisinde bulunan adreste bulunan nesneninadresidir. Bu da referans ierisindeki adresle ayn olmak zorundadr. Birreferansn da bir adresi vardr. Ama o adres deeri geerli bir ifdade ileelde edilemez. r bir referans olmak zere & &r; ifadesi geerli deildir.nk bu ifadenin edeer gsterici karl & &*p;dir ve &*p bir nesnedeildir.

    Yap Deikenlerinin Referans Yoluyla Fonksiyonlara Geirilmesi

    Bir yap deikeninin fonksiyona aktarlmasnda doru teknik yapdeikeninin adresinin fonksiyona geirilmesidir. Yani fonksiyon yapdeikeninin adresiyle arlr, fonksiyonun parametre deikeni o yaptrnden bir gsterici olur. Fonksiyonun ierisinde elemana ok(->)operatryle eriilir. Ancak C++ta ayn etkinlikte olmak zere referanslaaktarm da sz konusudur. Yani fonksiyon yap deikeninin kendisiyle

    arlr. Fonksiyonun parametre deikeni o yap trnden bir referansolur. Fonksiyon ieriisnde elemana nokta operatryle eriilir.

    /*----------referan2.cpp-------------*/#include

    struct PERSON{char *name;int no;

    };

    void disp(struct PERSON &r){printf("%s %d\n", r.name, r.no);

    }

    void main(void){

    struct PERSON per = {"Ali Sere", 123};

    disp(per);}

    /*--------------------------------------*/

    20

  • 7/29/2019 C++ E-Kitap

    21/101

    Yaplarn referans ya da gsterici yoluyla fonksiyonlara aktarlmastamamen edeer kullanmlardr.

    const Referanslar

    Bir referans da const olarak tanmlanabilir.

    Referans rnei Gstericiedeeri

    int a = 10;const int &b = a;

    b = 20; /* Hata */

    int a = 10;const int *p = &a;

    *p = 20; /* Hata */

    Const bir referans, gsterdii yer const olan const bir gstericiyeedeerdir. Yani byle referanslar sol tarafa deeri olarak kullanlamaz.

    nk referans ierisinde bulunan adresteki bilgi const yaplmtr. Constreferanslar da okunabilirlii arttrmak amacyla fonksiyon parametresiolarak kullanlrlar.

    void disp(const struct PERSON &r);Fonksiyonun referans olan parametresi de default argman alabilir.

    int x;

    void fonk(int &a = x) /*fonksiyonun referans olan parametresi default

    deer alm*/{...}

    char &a = Ali; /* Doru bir kullanmdr */

    Fonksiyonun Geri Dn Deerinin Referans Olma Durumu

    Return ifadesiyle geri dn deerinin oluturulmas aslnda derleyicitarafndan tahsis edilen geici bir blgeye yaplan atama ilemidir. Yani

    return ifadesi nce geici bir blgeye yerletirilir, sonra oradan alnarakkullanlr. Fonksiyonun geri dn deerinin tr bu geici blgenintrdr. Bir fonksiyonun geri dn deeri referans olabilir. Bu durumdafonksiyonun geri dn deerine ilikin geici blge referans trndendir.Bir referansa bir nesneyle ilk deer verileceine gre byle fonksiyonlarreturn ifadelerinin de nesne olmas gerekir.

    Gsterici edeeri Referans rnei/*-----referan3.cpp-----*/#include

    int a = 10;

    /*------referan4.cpp-----*/#include

    int a = 10;

    21

  • 7/29/2019 C++ E-Kitap

    22/101

    int *fonk(void){

    return &a;}

    void main(void){

    *fonk() = 20;printf("%d\n", a);

    }

    int &fonk(void){

    return a;}

    void main(void){

    fonk() = 20;printf("%d\n", a);

    }

    Artk bu fonksiyon kullanldnda referans kullanlyor gibi ilemgreceinden return ifadesindeki nesne anlalr. Byle fonksiyonlarn geridn deeri nesne belirtir ve sol taraf deeri olarak kullanlabilir. zetlereferansa geri dnen bir fonksiyonun geri dn deeri kullanldnda

    return ifadesindeki nesnenin kullanld anlalr.

    Bir Referansa Farkl Bir Trden Bir Nesneyle lk Deer VerilmesiDurumu

    Byle bir durumda nce referansla ayn trden geici bir deiken yaratlr.Verilen ilk deeri bu geici deikene atar, tabii otomatik trdntrlmesi olur ve yaratlan bu geici blgenin adresi referansaaktarlr.

    /*-----referan5.cpp-----*/#include

    void main(void){ /* Edeeri */

    double x = 3.2; /* double x =3.2; */int &r = x; /* int temp = x; */

    /* int &r = temp; */r = 5;printf("%f\n", x);

    }

    /*--------------------------*/

    Tabii bylesi bir durumda derleyiciler bir uyaryla durumu bildirirler.

    Bir Referansa Sabitle lk Deer Verilmesi Durumu

    Bir referansa bir sa taraf deeriyle de ilk deer verilebilir. Bu durumda ilkdeer olarak verilen sa taraf deeri derleyici tarafndan oluturulan geicibir blgenin ierisine aktarlr. Geici blgenin adresi de referansayerletirilir.

    22

  • 7/29/2019 C++ E-Kitap

    23/101

    Referans rnei Edeeri/*-----referan6.cpp-----*/#include

    void main(void)

    {int &r = 10;

    r = 50;printf("%d\n", r);

    }

    int temp;int &r = temp;

    Byle iki problemli ilk deer verme durumlarndan da kanmakgerekir. Her iki durumda da derleyici uyar mesaj verecektir.

    Gstericilerle Referanslar Arasndaki Benzerlikler ve Farkllklar

    - Gstericiler de referanslar da adres tutan nesnelerdir.- Referansn ierisindeki adres bir daha deitirilemez ama gstericinin

    ierisindeki adres deitirilebilir.- Diziler tr ne olursa olsun, referans yoluyla referanslara geirilemezler. nk dizi

    elemanlarna erimek iin adres arttrm yapmak gerekir.- Referanslar tek bir eleman fonksiyona geirmek iin kullanlabilirler.

    12-)Cde enum tr ile int tr tamamen ayndr.

    Yani enum trnden bir deikene int trnden bir deer atanabilir. OysaC++ta enum tr ayr bir trdr ve enum trnden deikenlere ancakenum trnden sabitler atanabilir.

    SINIFLAR(classes)

    Snflar nesne ynelimli programlama tekniini uygulayabilmek iinmutlaka gerekli olan Cdeki yaplara benzeyen C++a zg veri yaplardr.

    Tpk yaplarda olduu gibi snflarla da almadan nce bir snf bildirimi

    yapmak gerekir. Snf bildirimi bellekte yer kaplamaz(C++ta nesne terimidaha ok bir snf trnden deikeni anlatmakta kullanlr. Nesneynelimli programlama teknii snflar kullanlarak program yazmatekniidir).

    Snf Bildiriminin Genel Biimi:

    class [snf_ismi] {[private:]

    ...

    ...

    [protected:]...

    23

  • 7/29/2019 C++ E-Kitap

    24/101

    ...[public:]

    ...

    ...};

    Bir snf 3 blmden oluur:1. Private2. Protected3. Public

    Bir blm blm belirten anahtar szck ve iki nokta st ste ile balatlr,baka bir blm belirten szce kadar srer. Birden fazla ayn blmbelirten anahtar szck ayn snf bildirimi ierisinde kullanlabilir. Blmbelirten anahtar szcklerin biri ya da hibirisi yazlmak zorunda deildir.Snf hibir blm belirten anahtar szckle balatlmamsa private blm

    anlalr. Okunabilirlik asndan snf isminin ilk harfi byk geri kalanharfleri kk yazlr. Bir yap yalnzca veri elemanlarna sahiptir. Snflarhem veri hem fonksiyon ieren veri yaplardr. Yani normal yaplardansnflarn fazlalklar ayn zamanda fonksiyon da iermeleridir. Snfierisinde bildirilen deikenlere snfn veri elemanlar(data member) snfierisinde bildirilen fonksiyonlara ise snfn ye fonksiyonlar(memberfunction) denir(daha yksek seviyeli nesne ynelimli dilllerinde metod ismide kullanlr). Veri elemanlar ve ye fonksiyonlar snfn herhangi biryerinde yazlabilir. ye fonksiyonlarn sadece prototipleri snf ierisinekonur. Tanmlamalar snf bildiriminden sonra yaplr. Ancak genellikle

    protected blm pek kullanlmaz, snfn veri elemanlar private blmeye fonksiyonlar public blme yazlr.

    Bir Snf Trnden Nesnenin Tanmlanmas

    Genel biimi:

    [class] ;

    class Sample x;Sample y;

    Class anahtar szc yazlmayabilir. C++ta yap trnden nesnetanmlarken struct anahtar szc de kullanlmayabilir. Bir snf nesnesiiin snfn toplam veri elemanlar kadar yer ayrlr.

    /*-----class1.cpp-----*/#include

    class Sample {private:

    int a, b;

    public:void fonk(void);

    24

  • 7/29/2019 C++ E-Kitap

    25/101

    };

    void main(void){

    Sample x;

    printf("%d\n", sizeof(x));}/*-----------------------*/

    ye Fonksiyonlar Tanmlanmas

    ye fonksiyonlar prototipleri snf bildirimi ierisine yerletirilir,tanmlamalar darda aadaki gibi yaplr.

    [geri dn deerinin tr] :: ([parametreler])

    void Sample::fonk(void){

    }

    ki tane iki nokta stste C++a zg bir operatrdr. ye fonksiyonlarama koda parametre trleri ve snf isimleriyle kombine edilerek yazlrlar.

    Yani ayn isimli ve ayn parametre yapsna sahip bir ye fonksiyonu veglobal bir fonksiyon tanmlanabilir. Hibir snfa ait olmayan fonksiyonlaraglobal fonksiyon denir.

    Snfn Veri Elemanlarna ve ye Fonksiyonlarna Eriim

    Snfn veri elemanlarna ve ye fonksiyonlarna nokta operatryle eriilir.Bir ye fonksiyonu ancak ayn snf trnden bir nesneyle arlabilir. Eernesne olmadan arlrsa global bir fonksiyonun arld anlalr.

    X.fonk(); /*ye fonksiyonu arlm*/fonk(); /*global fonkiyon arlm*/

    /*-----class2.cpp-----*/#include

    class Sample {public:

    int a, b;public:

    void fonk(void);};

    void Sample::fonk(void)

    {printf("I'm sample fonk..\n");

    25

  • 7/29/2019 C++ E-Kitap

    26/101

    }

    void fonk(void){

    printf("I'm global fonk..\n");

    }

    void main(void){

    class Sample X;

    X.a = 10;X.b = 20;X.fonk();fonk();

    }

    /*-----------------------*/

    Bir ye fonksiyon ierisinde snfn hangi blmnde tanmlanm olursaolsun btn veri elemanlar ve ye fonksiyonlarna dorudan eriilebilir.

    Yani snfn veri elemanlar snfn ye fonksiyonlar arasnda ortak olarakkullanlmaktadr. Bir ye fonksiyon ierisinde kullanlan ye fonksiyonlar oye fonksiyon hangi snf nesnesiyle arlmsa o snf nesnesininelemanlar olur./*-----class3.cpp-----*/#include

    class Sample {public:

    int a;public:

    void fonk1(int x);void fonk2(void);

    };

    void Sample::fonk1(int x){

    printf("I'm sample fonk1..\n");a = x;}

    void Sample::fonk2(void){

    printf("%d\n", a);}void main(void){

    class Sample X;

    X.fonk1(50);

    26

  • 7/29/2019 C++ E-Kitap

    27/101

    Sample Y;

    Y.fonk1(100);X.fonk2();Y.fonk2();

    }/*-----------------------*/

    Bir ye fonksiyonu ierisinde snfn bir dier ye fonksiyonu da dorudanarlabilir. Snfn a ye fonksiyonu X nesnesiyle arlm olsun, a yefonksiyonu ierisinde b ye fonksiyonu dorudan arlabilir. Bu durumdab ye fonksiyonu ierisinde kullanlan veri elemanlar X snf nesnesineilikindir.

    /*-----class4.cpp-----*/#include

    class Sample {public:

    int a;public:

    void fonk1(int x);void fonk2(void);

    };

    void Sample::fonk1(int x){

    printf("I'm sample fonk1..\n");a = x;fonk2();

    }

    void Sample::fonk2(void){

    printf("%d\n", a);}

    void main(void){class Sample X;

    X.fonk1(50);}/*-----------------------*/

    Snf Faaliyet Alan(class scope)

    Cde dardan genie doru 3 tr faaliyet alan vardr:1. Blok faaliyet alan

    27

  • 7/29/2019 C++ E-Kitap

    28/101

    2. Fonksiyon faaliyet alan3. Dosya faaliyet alan

    Cde ve C++ta ayn faaliyet alanna ilikin birden fazla deiken aynisimle tanmlanamaz. Ancak farkl faaliyet alanna ilikin ayn isimli birden

    fazla deiken tanmlanabilir. Bir blok ierisinde birden fazla ayn isimlideiken faaliyet gsteriyorsa o blok ierisinde dar faaliyet alanna sahipolan eriilebilir.

    C++ta snf faaliyet alan diye isimlendirilen ayr bir faaliyet alan dahatanmlanmtr. Snf faaliyet alan fonksiyon faaliyet alan ile dosya faaliyetalan arasnda bir alana sahiptir. Snf faaliyet alan yalnzca bir snfn tmye fonksiyonlar arasnda tannma araldr. Snfn veri elelamanlar veye fonksiyon isimleri snf faaliyet alanna uyarlar. Bir snfn verielemanyla ayn isimli snfn ye fonksiyonu ierisinde ayn isimli bir yereldeiken tanmlanabilir. Bu durumda fonksiyon ierisindeki blokta yerelolana eriilir. Benzer biimde bir ye fonksiyon ierisinde bir fonksiyonarlmsa arlan fonksiyon ile ayn isimli hem global hem de bir yefonksiyon varsa dar faaliyet alan kuralna gre ye fonksiyon arldvarsaylr.

    znrlk Operatr(::)(scope resolution operator)

    :: operatrne znrlk operatr denir. Bu opertrn hem binary-infixhem de unary-prefix olarak kullanlan tipleri vardr.

    1. Binay infix resolution operatr:Bu kullanmda sol tarafndaki operandn bir snf ismi, sa tarafndakioperandn ise veri eleman ya da fonksiyon ismi olmas gerekir. Buoperatr snfn faaliyet alan probleminden dolay gizlenmi olan verielemanna ya da ye fonksiyonuna eriimini salar.

    void Sample::fonk1(int a){

    printf(Sample fonk1..\n);Sample::a = a; /*snfn veri eleman olan aya

    parametre ay ata*/

    }

    2. Unary prefix resolution operatr:Bu durumda operand global bir deiken ya da fonksiyon ismi olabilir.Bu haliyel bu operatr faaliyet alan probleminden dolay global olanaeriimi salar. Bu operatr ncelik tablosunun en yksek dzeyindebulunur.

    Balang ve Biti Fonksiyonlar

    1. Balang Fonksiyonlar(constructors)

    Bir snf destesi tanmlandnda derleyici tarafndan otomatik olarak

    28

  • 7/29/2019 C++ E-Kitap

    29/101

    arlan fonksiyona snfn balang fonksiyonu denir. Yerel bir snfnesnesi programn ak tanmlama noktasna geldiinde, global bir snfnesnesiyse program bellee yklenir yklenmez yaratlr. Balangfonksiyonun ismi snf ismiyle ayn olmaldr. Balang fonksiyonlarnngeri dn deeri gibi bir kavram yoktur. Yani geri dn tr yerine bir

    ey yazlmaz. bu durum int ya da void anlamna gelmez. Balangfonksiyonlar ierisinde return anahtar szc kullanlabilir, ancak yannabir ifade yazlamaz. C++ta farkl parametre yapsna sahip birden fazlabalang fonksiyonu olabilir. Parametresi olmayan(yani void olan)balang fonksiyonuna default balang fonksiyonu(default constructor)denir. Eer snf nesnesi nesne isminden sonra parantez almadan yaninormal bir biimde tanmlanm ise (rnein: X n;) bu durumda varsaylanbalang fonksiyonu arlr. Eer nesne isminden sonra bir parantezalr ve ierisine bir parametre listesi yazlrsa (rnein: X n(10);)parametre listesine uygun olan balang fonksiyonu arlr.

    Uyar: Nesne isminden sonra parantez alp iine hibireyyazlmazsa bu durumda varsaylan balang fonksiyonu arlmaz. Buifade bir fonksiyon prototipi anlamna gelir. rnein:

    X a(); /*parametresi olmayan, X trnden bir fonksiyonun prototipi*/

    Global snf nesnelerine ait balang fonksiyonlar main fonksiyonundannce arlr. Daha yukarda tanmlanan daha nce arlacak bir biimdesralama sz konusudur.

    2. Biti Fonksiyonu(destructor)

    Bir nesne faaliyet alann bitirmesiyle bellekten silinir. Yerel deikenlerprogramn ak tanmlandklar bloun sonunda, global deikenler iseprogramn bitimiyle bellekten silinirler. Bir snf nesnesi bellekten silineceizaman otomatik olarak arlan fonksiyona biti fonksiyonu(destructorfunction) denir. Biti fonksiyonunun ismi snf ismiyle ayndr, anck banabir ~ sembol getirilir. Biti fonksiyonunun da geri dn deeri gibi birkavram yoktur. Biti fonksiyonu en az ve en fazla bir tane olabilir.Parametresi void olmak zorundadr. Yani parametresi olmamak zorundadr.Varsaylan biti fonksiyonu diye bir kavram yoktur. Global bir snfnesnesine ait biti fonksiyonu programn sonucunda main bittikten sonra

    yani mainin sonunda altrlr. Balang ve biti fonksiyonlarnnarlma sralar her zaman terstir. a ve b herhangi trden iki snf nesnesiolmak zere balang fonksiyonlar nce a sonra b olacak eklindearlyorsa biti fonsiyonlar nce b sonra a eklinde arlr(LIFOsistemi).

    Balang ve Biti Fonksiyolarnn Bulundurulma Kural

    Snfn biti fonksiyonu olmak zorunda deildir. Yani varsa arlr yoksaarlmaz. Bir snf nesnesinin tanmlanma biimine uygun bir balangbir fonksiyonu olmak zorundadr. Ancak snfn hibir balang fonksiyonuyoksa ve nesne varsaylan balang fonksiyonu arlacak biimdetanmlanmsa bu durum istisna olarak hata oluturmaz. Ancak snfn

    29

  • 7/29/2019 C++ E-Kitap

    30/101

    herhangi bir balang fonksiyonu varsa fakat varsaylan balangfonksiyonu yoksa varsaylan fonksiyonu aracak biimde yaplacak birtanmlama hata ile sonulanr.Balang ve Biti Fonksiyonlarnn Kullanlma Nedenleri

    Nesne ynelimli programlama da bir snf belirli bir amac gerekletirenbir ktphane olarak ele alnabilir. rnein seri port ilemlerini yapan birsnf tasarlanabilir. Fare ilemleri iin ayr bir snf yazlabilir. Bu snflarnfaydal ilemleri yapan bir takm ye fonksiyonlar olmaldr. Bu yefonksiyonlar snfn veri elemanlarn ortak olarak kullanrlar. Bir snf birtakm yararl ileri yapmaya aday ise o yararl ilemleri gerekletirmekiin baz hazrlk ilemleri gerekebilir. rnein seri port ile ilgili ilem yapanbir snfta seri portun set edilmesi, fare ilemleri yapan snfta farenin resetedilmesi dosya ilemleri yapan bir snfta dosyann almas bu tr hazrlkilemleridir. Bu hazrlk ilemleri snfn balang fonksiyonu ierisindeyaplrsa snf kullanan kod klr, ayrntlar gz ard edilir ve alglamaiyiletirilir(abstraction). rnein dosya ilemleri yapan snfn balangfonksiyonu ierisinde dosya alabilir. Nesne tanmlanr tanmlanmazhazrlk ilemlerinin otomatik olarak yaplmas snf kullanan kiilerin deilerini kolaylatrr.

    Biti fonksiyonu balang fonksiyonuyla yaplan hazrlk ilemlerininotomatik bir biimde geri alnmas iin kullanlr. rnein dosya ilemleriniyapan snfn biti fonksiyonu otomatik olarak kapayabilir. Seri portilemlerini yapan snfn biti fonksiyonu port ayarlarn eski durumunagetirebilir. Tabii baz durumlarda hazrlk ilemlerinin geri alnmas

    gerekmeyebilir. Yani balang fonksiyonunun olmas biti fonksiyonununolmasn mantksal bakmdan gerekli klmaz.

    Snflarda Temel Eriim Kurallar

    Temel eriim kural snf blmlerinin ne anlama geldiiyle ilgilidir. ki kuralvardr:

    1. Bir snf nesnesi yoluyla dardan nokta ya da ok operatrnkullanarak snfn yalnzca public blmnde bildirilen veri elemanlarnaya da fonksiyonlarna eriilebilir. Private veya protected blmlerine

    eriilemez.2. Snfn ye fonksiyonu hangi blmde bildirilmi olursa olsun snfn her

    blmndeki veri elemanlarna ve ye fonksiyonlarna eriebilir. Yaniye fonksiyonlar ierisinde snfn her blmndeki veri elemanlarnkullanabilir ve ye fonksiyonlarn arabiliriz.

    Genellikle snfn veri elemanlar snfn rivate blmnde ye fonksiyonlarise public blmde tutulur. Bylece veri elemanlarna dardan dorudaneriilemez. Dardan dorudan ye fonksiyonlara eriilir. ye fonksiyonlarveri elemanlarna eriirler. Yani veri elemanlarna dorudan deil yefonksiyonlar yoluyla eriilmesi istenmitir. Eer private blgedeki verielemanlarnn deerlerini almak ya da bunlara deer yerletirilmekistenirse bunlarla iliki kuran bir grup get ve set fonksiyonu yazmak

    30

  • 7/29/2019 C++ E-Kitap

    31/101

    gerekir.

    Yeniden kullanlabilirlik(reusability) nesne ynelimli programlamatekniinin anahtar kavramlarndan birisidir. Bu kavram yazlm olan birkodun zellikle de bir snfn baka projelerde tekrar yazlmadan

    kullanlmas anlamna gelir.

    Veri Elemanlarnn private, ye Fonksiyonlarnn public KsmnaYazlmas

    Genellikle snflarda veri korumas istendii zaman snfn veri elemanlarprivate blgeye ye fonksiyonlar ise public blgeye yazlrlar. Snfn verielemanlarnn private blgeye yerletirilmesi dardan onlara dorudaneriimi engeller. Onlara public blgedeki bir grup ye fonksiyon ile eriiriz.Normalde tasarlanm olan bir snf ok deiik ve uzun kodlardakullanlabilir. Yani snf kullanan kodlar snfn kendi kodlarndan ok dahafazladr. Eer veri elemanlarn private blgeye yerletirirsek o verielemanlarnn genel yapsnda deiiklik olduunda snf kullanan kodlardeitirmek zorunda kalmayz. Yalnzca prototipleri ayn kalmak zeresnfn ye fonksiyonlarn yeniden yazmak zorunda kalrz. Oysa verielemanlar public blgeye yerletirilseydi, dardan bu elemanlaradorudan eriilebilirdive veri yaps deitiinde onu kullanan tm kodlardeitirmek gerekirdi. eitli veri elemanlarn ve ye fonksiyonlar privateblgeye yerletirmekle onlar snf kullanan kiinin algsndan uzak tutarz.Kiiler eriemeyecekleri bilgileri incelemezler. Bu durumda nesne ynelimliprogramlama tekniinde veri gizleme(data hiding) denir. Tabi veri

    elemanlarnn private blgeye yerletirilmesi bunlara eriimi zorlatrr.nk eriim dorudan deil, ara birim ye fonksiyonlarla yaplr. Snfnveri yaps deitirilmeyecekse veri elemanlar dorudan public blgeye deyerletirilebilir. Bu durumda onlar dorudan kullanmann bir zarar olmaz.

    /*----date2.cpp----*//*----date3.cpp----*/

    Dinamik Tahsisat Yapan Snflar

    Pek ok snf balang fonksiyonu ierisinde bir veri eleman iin dinamiktahsisat yapar. Tahsis edilen bu dinamik blgenin biti fonksiyonu

    ierisinde otomatik olarak sisteme iade edilmesi istenir.

    /*----consdest.cpp----*/

    Bir dosyann balang fonksiyonu iinde almas ve biti fonksiyonundaotomatik olarak kapatlmas gibi durumlara ska rastlanr.

    /*----clasfile.cpp----*/

    Bazen biti fonksiyonunda otomatik olarak yaplan geri alma ilemi bir yefonksiyon ile bilinli olarak da yaplabilir. Bylece biti fonksiyonundaki gerialma ilemi geersiz hale gelir. nk geri alma ilemi daha ncegeeklemitir. O halde biti fonksiyonu ierisinde geri alma ilemi daha

    31

  • 7/29/2019 C++ E-Kitap

    32/101

    nce yaplmsa geri alma ilemini yapmamak gerekir. bunu salamak iineitli veri elamanlarndan faydalanlabilir.

    File::File(void){

    f = NULL;}

    File::~File(void){

    if (f)fclose(f);

    }

    Snf Trnden Gstericiler ve Adresler

    Bir snf nesnesinin veri elamanlar tpk bir yap gibi bellee adrl birbiimde yerletirilir. Snfn ayn blmndeki veri elemanlar o blmierisinde ilk yazlan dk anlaml adreste olacak biimde ardl olarakyerletirilirler. Ancak blmlerin sras iin herhangi bir zorunlulukstandartlara konulmamtr. Yani blm ileri ilk yazlan dk anlamladreste olacak biimde yerletirilir, ancak blmlerin kendi aralarnda naslyerletirilecei derleyiciden derleyiciye deiebilir. Blmler aras yerleimde ardl olmak zorundadr. Ancak derleyicilerin hemen hepsi blm farkgzetmeksizin ilk yazlan elemann dk anlaml adreste olaca biimdeyerleim kullanrlar. Bir snf nesnesinin adresi alnabilir. Elde edilen

    adresin saysal bileeni snf veri eleman blounun balang adresidir. Birsnf trnden deikenin adresi ayn trden bir snf gstericiyeyerletirilmelidir. Bir snf gstericisi yoluyla snfa ilikin bir ye fonksiyonok operatryle ya da * ve nokta operatryle arlabilir.

    Date x(10, 10, 1999);Date *p;

    p = &x;x.Disp(); /* Disp() fonksiyonu arlr */

    p -> Disp(); /* Disp() fonksiyonu arlr */

    (*p).Disp(); /* Disp() fonksiyonu arlr */

    Bir ye fonksiyon snfa ilikin bir gsterici kullnlarak ok operatrylearldnda ye fonksiyon o gstericiyel belirtilen adreste bulunan verielemanlarn kullanr.

    p -> Disp(); Disp() ye fonksiyonu p gstericisinin ierisinde bulunan verielemanlarn kullanr.

    /*-----date4.cpp-----*/

    Yine gsterici yoluyla snfn veri elemanlarna eriilir. Tabii bu elemanlarnpublic blgede olmas gerekir.

    32

  • 7/29/2019 C++ E-Kitap

    33/101

    Snf Trnden Referanslar

    Bir snf trnden referans ayn trden bir snf nesnesiyle ilk deerverilerek tanmlanabilir. Bu durumda derleyici ilk deer olarak verilen snf

    nesnesinin adresini referansa yerletirir. Bir referans yoluyla snfn verielemanlarna ve ye fonksiyonlaryla nokta operatr kullanlarak eriilir.Bir referans ile bir ye fonksiyonu arldnda ye fonksiyon referansnierisinde bulunan adresteki veri elemanlarn kullanr.

    /*-----date5.cpp-----*/

    Snf Trnden Deikenlerin Fonksiyonlara Geirilmesi

    Bir snf tpk yap gibi bileik bir nesnedir. Bu durumda yaplarda olduugibi fonksiyona geirmede iki teknik kullanlabilir. Snfn kendisiningeirilmesi yntemi zel durumlar dnda kt bir tekniktir. Adresyntemiyle fonksiyona geirme teknii tercih edilmelidir. Adresle geirmeilemi C++ta iki biimde yaplabilir:1. Gsterici kullanlarak: Yani fonksiyon bir snf nesnesinin adresiyle

    arlr. Fonksiyonun parametre deikeni de ayn snf trnden birgsterici olur. Bu durumda fonksiyon ierisinde snfn veri elemanlarnave ye fonksiyonlarna ok operatryle eriilir./*-----date6.cpp-----*/

    2. Referans kullanlarak: Bu durumda fonksiyon bir snf nesnesininkendisiyle arlr. Fonksiyonun parametre deikeni ayn trden bir

    referans olur. Fonksiyon ierisinde veri elemanlarna ve yefonksiyonlarna nokta operatryle eriilir./*-----date7.cpp-----*/

    Bu iki yntem arasnda etkinlik fark yoktur.

    Date *p;

    p - > Disp();

    fadesi syntax bakmndan geerlidir. Ancak bir gsterici hatas sz

    konusudur. Disp() fonksiyonu p gstericisinin ierisindeki rastgele yerdekiveri elemanlarn kullanr. Bir snf trnden referans ya da gstericitamnmlandnda balang fonksiyonu arlmaz. nk balangfonksiyonu nesnenin kendisi tanmlandnda arlmaktadr.

    Snf Trnden Dinamik Alan Tahsis Edilmesi

    New operatryle bir snf trnden heap zerinde dinamik bir alan tahsisedilebilir. Tahsis edilen alann balang adresi ayn trden bir gstericiyeatanmaldr. Madem ki new operatryle heap zerinde bir nesneyaratlyor o halde yaratlan nesne iin balang fonksiyonu arlr. Birsnf trnden dinamik alan tahsis edildiinde tahsis edilme ilemininhemen ardndan derleyici tarafndan otomatik olarak tahsis edilen alan iin

    33

  • 7/29/2019 C++ E-Kitap

    34/101

    balang fonksiyonu arlr. Eer snf isminden sonra bir parantezalmazsa varsaylan balang fonksiyonu, alr ve bir parametre listesiyazlrsa parametre listesine uygun olan balang fonksiyonu arlr.

    X *p;

    p = new X; /*default balang fonksiyonu arlr*/p = new X(a, b, c); /*parametreleri uyan balang fonksiyonu arlr*/p = new X(); /*default balang fonksiyonu arlr */

    /*-----date8.cpp-----*/

    C++ta dinamik bellek ynetiminin dinamik bellek fonksiyonlaryla deil de new vedelete ile yaplmasnn nedeni balang fonksiyonunun otomatik olarakarlmasn salamak iindir.

    Snf Trnden Yaratlm Dinamik Bir Alann Boaltlmas

    Dinamik olarak tahsis edilmi bir snf delete operatryle sisteme iadeedilebilir. delete operatr alan serbets brakmadan nce bitifonksiyonunu otomatik olarak armaktadr.

    /*-----date9.cpp-----*/

    new operatryle bir snf trnden bir dizi alan tahsis edilebilir.

    p = new X[n];Bu durumda derleyici n * sizeof(X) kadar alan dinamik olarak tahsis eder veyaratlm olan n nesnenin her biri iin default balang fonksiyonunuarr. Bir dizi iin alan tahsis edilmesi durumunda tahsis edilen snfnesneleri iin baka bir balang fonksiyonu arlamaz.

    p = new X[n] (a, b, c); /*Geerli deildir. Tr dnm olarak dnlr*/

    Ancak bir dizi snf nesnesi iin dinamik tahsisat ilemine ok nadirrastlanr. Bir dizi snf nesnesi iin tahsis edilmi olan alann delete ile

    silinmesi durumunda her bir snf nesnesi iin ayr ayr biti fonksiyonuarlr. Ble bir durumda eer yanllkla silme ilemi keli parantezkullanlmadan yaplrsa(rnein: delete p;) tm dinamik alan serbestbraklr fakat yalnzca ilk yaratlm nesne iin biti fonksiyonu arlr.

    /*-----date10.cpp-----*/

    Snf Trnden Dinamik Tahsisat leminin Anlam ve nemi

    class X{

    public:X(int n);

    34

  • 7/29/2019 C++ E-Kitap

    35/101

    void Disp(void);private:

    int x;};X:X(int n)

    {x=n;

    }

    void X::Disp(void){

    printf(%d\n,x);}X::~X(void){

    printf(I am a destructor\n);

    }

    X *p;

    void main (void){

    {

    }

    }

    Normal bir snf nesnesi iin balang ve biti fonksiyonlarnn arlacanokta, nesnenin tanmland yere gre belirlenmektedir. rnein yerel birnesne iin biti fonksiyonu kesinlikle tanmlama blonun sonunda arlr.Oysa tahsisat ilemi dinamik olarak yaplrsa, nesnenin yaratlmas vebellekten silinmesi, balang ve biti fonksiyonlarnn arlmasprogramcnn istedii noktada yaplabilir.Dinamik olarak tahsis edilmi snf nesnesi iin delete operatr ile silmeyaplmamsa tahsis edilmi olan alan normal olarak programn bitimindesisteme iade edilir. Ancak bu iade edilme ilemi srasnda biti fonksiyonu

    arlmaz. Dinamik olarak tahsis edilmi bir alan iin biti fonksiyonununarlmas ancak delete ilemi ile mmkn olabilir.

    Snf nesnesi iin dinamik tahsisat yapld halde balang fonksiyonunarlmamas aadaki gibi salanabilir.

    p= (X *) new char [sizeof(X)]

    CONST ye fonksiyonlar

    Standart Cde bir fonksiyonun const olmas tanml ve geerli deildir. OysaC++ds bir snfn ye fonksiyonu const olabilir. (C++da global bir

    35

  • 7/29/2019 C++ E-Kitap

    36/101

    fonksiyon const olamaz, sadece snf ye fonksiyonlar const olabilir)

    Bir ye fonksiyonu const yapabilmek iin, fonksiyon prototipinde vetanmlama srasnda parametre parantezi kapatldktan sonra constanahtar szc yazlmaldr. (Not const anahtar szcnn hem

    prototipte hem de tanmlama cmlesinde yazlmas zorunludur).Const ye fonksiyon ierisinde snfn ye elemanlar deitirilemez.

    Class X{

    public:X(int n);void set(int n);void Disp (void) const;~X(void);

    private:

    int x;};

    X::X(int n){

    x=n;}

    void X::Disp(void) const{

    printf(%d\n,x);x=10;

    }

    X::~X(void){

    printf(I am a destructor\n);}

    void main(void)

    { X a(20); //hata verecek a.disp();

    }

    Const ye fonksiyonlar, const ye fonksiyonlarda olduu gibi okunabilirliiartrmak iin kullanlabilir.

    Class X{

    public:X(int n);

    36

  • 7/29/2019 C++ E-Kitap

    37/101

    void set(int n);void Disp (void) const;~X(void);

    private:int x;

    };

    X::X(int n){

    x=n;}

    void X::set(int n){

    x=n;}

    void X::Disp(void) const{

    printf(%d\n,x);x=10;

    }

    X::~X(void){

    printf(I am a destructor\n);}

    void main(void){

    X a(20); //hata verecek a.disp();a.set(50);a.disp();

    }

    Const bir fonksiyon ierisinde const olmayan bir fonksiyon arlamaz,nk const olmayan bir fonksiyon snfn veri elemanlarn kullanabilir.

    Const bir ye fonksiyonun ierisinde snfn btn ye elemanlarnn constolduu kabul edilir. rnein byle bir ye fonksiyon ierisinde snfn birveri elemannn adresi const olmayan bir gstericiye atanamaz.

    Not: C++da const bir deikenin adresi const olmayan bir gstericiyeatanamaz.

    Snfn balang ve biti fonksiyonlar const ye fonksiyonu olarak

    tanmlanamaz. Yasak.

    37

  • 7/29/2019 C++ E-Kitap

    38/101

    Const Snf Nesneleri

    void main(void){

    const X a(10);

    }

    Bir snf nesnesi const olabilir. Bu durumda snf nesnesinin veri elemanlarher hangi bir biimde deitirilemez. Const bir snf nesnesi ile ancak constbir ye fonksiyon arlabilir, const olmayan bir ye fonksiyon arlamaz.

    Not: Const tamamen derleyici iin olan bir kavramdr.

    Const bir snf gstericisi ya da referans sz konusu olabilir. Tabii bugsterici ya da referansla ancak const ye fonksiyonlar arlabilir.zellikle bir fonksiyonun parametre deikeninin const bir snf gstericisi

    ya da const bir snf referans olma durumuna sklkla rastlanr.

    String Snf

    Cde yazlar zerinde ilem yapmak iin karakter dizileri kullanlr. Ancakkarakter dizilerinin normal bir dizi biiminde tanmlanmas genelliklekullanlan yntem olsa da nemli problemleri vardr. rnein dizininuzunluu sabit ifadesi olmak zorundadr. Bylece yazlarn bytlmesi gibiilemler verimsiz bir biimde yaplr. nk ilemler en kt olaslkla uzundiziler alarak yrtlmek zorundadr. Bu da bellein verimsiz kullanlmas

    anlamna gelir. Tabii dinamik bellek ynetimiyle yer kaplama bakmndanetkinlik problemi giderilebilir. Ancak ilemsel karmaklk artar, kodbymesi oluur. Ancak C++ta yaz ilemleri iin zel tasarlanm stringsnflar kullanlabilir. Bu snflar yazlar dinamik olarak saklarlar. Dinamikbellek ilemleri ye fonksiyonlar tarafndan otmatik olarak yapld iinalglsal dzeyde karmaklk olumaz. Bir snf kullanlarak yazlar zerindeilemler yapmak iin MFC snf sisteminde Cstring isimli bir snftasarlanmtr. Yine son yllarda ANSI C++ ierisine dahil edilen standartbir string snf vardr. Standardizasyon konusundan problemleri olmasnakarn yaz ilemlerini yapan bir string snf her trl derleyici sistemindeve snf ktphanelerinde kullanlmak zere hazr bulundurulmaktadr.

    Byle bir snfn tasarm iin C++n pek ok konusundanfaydalanlmaktadr. Kurs ierisinde eitli konular grlrken bu snf tekrartekrar grlecektir.

    String Snfn Tasarm

    String snfn en az iki private veri eleman olmaldr. Birincisi yaznnbalang adresini tutan karakter trnden bir adrestir. Yaz iin alandinamik olarak tahsis edilerek balang adresi bu gstericiyeyerletirilecektir. kinci veri eleman yaznn uzunluunu tutan int trndenbir deiken olabilir. Tabii aslnda yaznn sadece balang adresininbilinmesi uzunluunun istenildii zaman bulunabilecei anlamnagelmektedir. Ancak yaz uzunluuna duyulan gereksinimin fazlal ve hzn

    38

  • 7/29/2019 C++ E-Kitap

    39/101

    yer kaplamaya gre tercih edilmesi byle bir veri elemannn bulunmasnanlaml hale getirmektedir. Byle bir snftan ilk istenecek ey dinamikyaplan tahsisatlarn ye fonksiyonlar tarafndan gizlicegerekletirilmesidir. Snfn balang fonksiyonu new operatryletahsisat yapabilir ve biti fonksiyonu bu tahsisat serbest brakabilir.

    Bir Snfn Baka Bir Snf Trnden Veri Elemanna Sahip OlmasDurumu

    Bir snf baka bir snf trnden veri elemanna sahipse o snfn yefonksiyonlar ierisinde eleman olan snf nesnesine eriilebilir. Ancak osnf nesnesinin private ve protected blmlerine eriilemez. Snfnbalang fonksiyonu bir ye fonksiyonuymu gibi dardan arlamaz,nesne yaratlrken otomatik olarak arlr. O halde bir snfn baka snftrnden veri elemanna sahip olmas durumunda bu veri elemannabalang fonksiyonu ierisine nasl ilkdeer atanacaktr? Bunu salamakiin C++ta eleman olan snfn balang fonksiyonu eleman nesne iinelemana sahip snfn balang fonksiyonunun ana blounun bandagizlice arlr. Eer : syntaxi ile bir belirleme yaplmamsa elemanolan snfn default balang fonksiyonu arlr. Eer : ile verielemannn ismi yazlp parantez ierisine bir parametre listesibelirtilmise, eleman b parametre listesine uygun balang fonksiyonu ileilk dee alr. X bir snf a ise baka bir snf trnden X snfnn bir verieleman ise bu veri eleman iin istenilen bir balang fonksiyonununarlmas aadaki syntax ile yaplr.

    X::X(...) : a(..){...

    }

    Bir parametre deikeninin faaliyet alan tanmlanma noktasndanfonksiyonun sonuna kadar olan blgedir. Yani elemana ilikin :ifadesinde fonksiyon parametreleri dorudan kullanlabilir.

    /*-----claincla.cpp-----*/#include

    #include #include

    class Date {int day, month, year;

    public:Date(void);Date(int d, int m, int y);void Disp(void) const;

    };

    class Person {char *name;

    39

  • 7/29/2019 C++ E-Kitap

    40/101

    Date bdate;public:

    Person(const char *nm, int d, int m, int y);void Disp(void) const;~Person(void);

    };Date::Date(int d, int m, int y){

    day = d;month = m;year = y;

    }

    Date::Date(void){

    long t;

    t = time(NULL);struct tm *p = localtime(&t);

    day = p -> tm_mday;month = p -> tm_mon + 1;year = p -> tm_year + 1900;

    }

    void Date::Disp(void) const{

    printf("%02d/%02d/%04d\n", day, month, year);}

    void Person::Person(const char *nm, int d, int m, int y) : bdate(d, m, y){

    name = new char[strlen(nm) + 1];strcpy(name, nm);

    }

    void Person::Disp(void) const

    { printf("%s\n", name);bdate.Disp();

    }

    Person::~Person(void){

    delete[] name;}

    void main(void)

    { Person X("Ali Sere", 10, 12, 1990);

    40

  • 7/29/2019 C++ E-Kitap

    41/101

    X.Disp();}/*-------------------------*/

    Balang fonksiyonlarnn arlma sralar nce elemana ilikin snfnbalang fonksiyonu sonra elemana sahip snfn balang fonksiyonubiimindedir. C++ta her zaman balang ve biti fonksiyonlarnnarlma sras terstir. Bu durumda elemana ilikin snfn bitifonksiyonuelemana sahip biti fonksiyon blounun sonunda otomatik olarak arlr.

    Yani elemana sahip snfn biti fonksiyonu daha nce arlmaktadr.

    Bir snfn baka snf trnden birden fazla veri eleman varsa bu verielemanlar iin balang fonksiyonlar arlma sras snf bildiriminde ilkyazlan nce olacak biimde yaplr. : syntaxi ile belirtilen sra nelideildir.

    class Y {.................

    };

    class X {..................Y a, b;

    };

    X:X(....) : b(...), a(...){

    ........

    ........}

    /*nce ann parametreleriylebelirtilen */ /*Y snfnnbalang fonksiyonu arlr. */

    Biti fonksiyonlarnn arlma sras balang fonksiyonuna gre terssrada olmak zorundadr. Yani rnekte nce b iin biti fonksiyonu alr.

    Bir Snfn baka Bir Snf Trnden Gsterici Veri Elamanna SahipOlmas Durumu

    Bu duruma dier durumdan daha sklkla rastlanmaktadr. Tabii gstericiveri eleman iin balang fonksiyonu arlmaz. Ancak elemana sahip

    41

  • 7/29/2019 C++ E-Kitap

    42/101

    snfn balang fonksiyonu ierisinde bu gsterici iin dinamik tahsisatyaplmaldr. Elemana sahip biti fonksiyonu ierisinde de deleteoperatryle balang fonksiyonunda tahsis edilen alan serbestbraklmaldr. Bu serbest brakma ile biti fonksiyonu da kendiliindenarlacaktr.

    /*-----claincl2.cpp-----*/#include #include #include

    class Date {int day, month, year;

    public:Date(void);Date(int d, int m, int y);

    ~Date(void);void Disp(void) const;

    };

    class Person {char *name;Date *bdate;

    public:Person(const char *nm, int d, int m, int y);void Disp(void) const;~Person(void);

    };

    Date::Date(int d, int m, int y){

    day = d;month = m;year = y;

    }

    Date::Date(void)

    { long t;

    t = time(NULL);struct tm *p = localtime(&t);

    day = p -> tm_mday;month = p -> tm_mon + 1;year = p -> tm_year + 1900;

    }void Date::Disp(void) const

    {printf("%02d/%02d/%04d\n", day, month, year);

    42

  • 7/29/2019 C++ E-Kitap

    43/101

    }

    Date::~Date(void){

    printf("I am a Date destructor..\n");

    }

    void Person::Person(const char *nm, int d, int m, int y){

    name = new char[strlen(nm) + 1];strcpy(name, nm);bdate = new Date(d, m, y);

    }void Person::Disp(void) const{

    printf("%s\n", name);bdate -> Disp();}

    Person::~Person(void){

    delete[] name;delete bdate;

    }

    void main(void){

    Person X("Ali Sere", 1, 2, 1990);

    X.Disp();}/*-------------------------*/

    inline Fonksiyonlar

    C++ta bir fonksiyon tanmlarken geri dn deerinin nne inline

    anahtar szc getirilebilir. rnein:inline void fonk(void){

    ....}

    (inline anahtar szc prototipte deil tanmlama srasndakullanlmaldr.)

    Bir inline fonksiyon tpk bir makro gibi ilem grr. Yani inline fonksiyon

    arldnda fonksiyon arma kodu yerine fonksiyon kodunun kendisiyerletirilir.

    43

  • 7/29/2019 C++ E-Kitap

    44/101

    /*-----inline.cpp-----*/#include

    inline double square(double x)

    {return x * x;

    }

    void main(void){

    double n;n = square(3);printf("%lf\n", n);

    }/*----------------------*/

    Inline ile yaplmak istenen makro ile yaplmak istenenle ayndr. Makro nilemci tarafndan alrken inline fonksiyonlar derleme modl tarafndanalmak. inline fonksiyonlar ile makrolar ayn amalar iin kullanlmalarnakarn inline fonksiyonlar makrolara gre ok daha kullanl ve salamdr.rnein: Makrolar ++ ve operatrleriyle arlamad halde(pheli kodoluabilir), inline fonksiyonlar gvenli bir biimde arlabilir. nk inlinefonksiyonlarda nce parametre ifadesi deerlendirilir, sonra ama ilemigerekletirilir. Tabii inline fonksiyonlar normal bir fonksiyon gibi yazlparlrlar. Operatrlerin nceliinden oluacak problemler derleyicitarafndan zaten giderilirler. inline fonksiyon parametrelerini parantezierisine almaya gerek yoktur. inline fonksiyonlar dier fonksiyonlardaolduu gibi tr dntrmesi ve tr bakmndan derleyicinin denetimindengeerler. Yani inline fonksiyonlarda errorler ortaya kabilir, bylece kodalmadan hatalar tespit edilir. Yani daha salamdr. Bu nedenlerden dolayC++ta neredeyse makro hi kulanlmaz. Hep inline fonksiyonlar kullanlr.

    Snfn normal trlerden veri elemanlar da balang fonksiyonunda :syntaxi ile ilk deer alabilirler. rnein:

    Edeeri

    X::X(void):a(10), b(20){....

    }

    X::X(void){a = 10;b = 20;

    }

    rnek bir snf:

    CRect isimli snf MFC snf sistemi ierisinde kullanlan ve drtgenselblgeler zerinde temel ileri yapmay hedefleyen bir snftr. Snfn

    drtgensel blgeni sol st ve sa alt kegenini belirleyen 4 veri elemanvardr.

    44

  • 7/29/2019 C++ E-Kitap

    45/101

    /*-----crect.cpp-----*/#include

    class CRect {

    int x1, y1, x2, y2;public:

    CRect(void);CRect(int c1, int r1, int c2, int r2);int Width(void) const;int Height(void) const;void InflateRect(int width, int height);int IsEmpty(void) const;void Disp(void) const;

    };

    CRect::CRect(void){

    x1 = x2 = y1 = y2 = 0;}

    CRect::CRect(int c1, int r1, int c2, int r2){

    x1 = c1;y1 = r1;x2 = c2;y2 = r2;

    }

    int CRect::Width(void) const{

    return x2 - x1;}

    int CRect::Height(void) const{

    return y2 - y1;}

    void CRect::InflateRect(int width, int height){x1 = x1 + width;

    x2 = x2 - height;y1 = y1 + width;y2 = y2 - height;

    }

    int CRect::IsEmpty(void) const{

    45

  • 7/29/2019 C++ E-Kitap

    46/101

    if(Width() && Height())return 0;

    return 1;}

    void CRect::Disp(void) const{

    printf("[%d, %d; %d, %d]\n", x1, y1, x2, y2);}

    void main(void){

    CRect a(5, 5, 20, 20);

    a.Width();a.Height();

    a.Disp();a.InflateRect(-6, 4);a.Disp();if(a.IsEmpty())

    printf("bo ite\n");else

    printf("dolu\n");}/*---------------------*/

    Snfn Veri Elemanlarna Eriim ve this Gstericisi

    Bir snfn ye fonksiyonu bir snf nesnesiyle arldnda aslnda snfnesnesinin adresi gizlice ye fonksiyona geirilir. ye fonksiyon ierisindesnfn veri elemanlarna erime bu gizlice geirilmi olan gsterici yluylayaplr. Yani bir ye fonksiyonunun hi parametresi yoksa aslnda gizli birparametresi vardr. Bu da arlan snf nesnesinin adresini tutangstericidir. Snfn ye fonksiyonlarnn, snfn veri elemanlarna erimesiaslnda adres yoluyla yaplmaktadr. Tabii kolaylk olmas bakmndangeirilen bu gizli gsterici aka parametre listesinde grnmez. Eriimsrasnda ok operatr de kullanlmaz.

    C++ta ye fonksiyonunuarlmas

    Cdeki karl

    void Crect::Disp(void) const{

    printf([%d, %d; %d, %d]\n,x1, y1, x2, y2);

    }

    void main(void){

    CRect x(10, 10, 20, 20);x.Disp();

    void Crect_Disp(const Crect *this){

    printf([%d, %d; %d, %d]\n,this -> x1, this -> y1,this -> x2, this ->y2);

    }

    void main(void)

    {CRect x = {10, 10, 20, 20};

    46

  • 7/29/2019 C++ E-Kitap

    47/101

    } Crect_Disp(&x);}

    ye fonksiyona gizlice geirilen bu adres ye fonksiyon ierisinde aka thisanahtar szcyle kullanlabilir. this parametre biiminde programc

    tarafndan yazlamaz, ancak yazlm gibi kullanlabilir. x bir snfn verieleman olmak zere ye fonksiyon ierisinde x ile this ->x tamamen aynanlamdadr. Bir ye fonksiyon baka bir ye fonksiyonu aryorsa aranye fonksiyona ilikin this gstericisi dorudan arlan fonksiyonageirilir. this gstericisi global fonksiyonlarda kullanlmaz, sadeceherhangi bir snfn ye fonksiyonu ierisinde kullanlabilir. this gstericisihangi snfn ye fonksiyonunda kullanlrsa tr de o snf trndengsterici olur. this gsterisinin deeri deitirilemez. this gstericisikendisi const olan const bir gsterici biimindedir.

    /*-----this.cpp-----*/

    #include

    class X {int a;

    public:void fonk(void);

    };

    void X::fonk(void){

    printf("%p\n", this);}

    void main(void){

    X n;printf("%p\n", &n);n.fonk();

    }/*-------------------*/

    Snf i inline FonksiyonlarSnfn veri elemanlar private ya da protected blme yerletirilmise buveri elemanlarna eitli public ye fonksiyonlaryla eriilir. Bu trfonksiyonlara Get ve Set fonksiyonlar denir. Snfn bu tr kkfonksiyonlar tipik inline fonksiyonu olarak yazlmaldr. Bir snfn yefonksiyonunun tanmlanmas darda deil snfn ierisinde de yaplabilir.rnein:

    class X {int a, b;

    public:X(int x, int y)

    47

  • 7/29/2019 C++ E-Kitap

    48/101

    {a = x;

    b = y;}

    };

    /*-----inline1.cpp-----*/#include #include

    class X {int a;

    public:void fonk(void){

    printf("%p\n", this);

    }

    };

    void main(void){

    X n;

    printf("%p\n", &n);n.fonk();

    }/*-----------------------*/

    Bunun gibi snf bildirimi iinde tanmlanan fonksiyonlar otomatik olarakinline fonksiyon olarak kabul edilir. Snf ierisinde tanmlanmfonksiyonlarn srasnn hibir nemi yoktur. Yani yukardaki fonksiyonaadaki fonksiyonu arabilir. inline bildirimi (darda ya da gizlicesnf iinde) bir zorunluluk biiminde deil bir istek biimindedir. Yaniderleyici bir inline fonksiyonu inline olarak aamayabilir. Eer aamazsaonu normal bir fonksiyon gibi ele alr. Aamadndan dolay herhangi birerror ya da warning mesaj olumaz(tpk register anahtar szcnde

    olduu gibi). Genel olarak uzun kod ieren, karmak dng ve if deimleriieren fonksiyonlar inline olarak alamazlar.

    Snflarn Tretilmesi

    Daha nce yazlm olan bir snfa ekleme yaplmas istendiindebavurulacak en iyi yntem tretme ilemidir. Bir snfa ek yapmak snfayeni veri ve ye fonksiyonu eklemek anlamndadr. Bir snfa ek yapmakiin tretme dnda birka yntem akla gelebilir:

    1. Snfa dorudan

    ekleme yapmak

    Bu durumda nceki snfn bir kopyas kartlr ve

    zerinde eklemeler yaplrsa, gereksiz bir biimdeye fonksiyon tekrar yaplr.

    48

  • 7/29/2019 C++ E-Kitap

    49/101

    T?retme bi?imi

    2. nceki snf birveri eleman olarakkullanan yeni birsnf tanmlamak

    class A {//...

    };class B {

    A a;

    //...};Bu durumda veri eleman public blgeyeyerletirilirse geniletilecek snfn ye fonksiyonlarbu nesne sayesinde arlr. Ancak bu yntem detretme yntemine gre eitli kstlamalar olan biryntemdir.

    Bir snfn ilevleri tretme yoluyla geniletilecekse tretmenin yaplavcasnfa taban snf (base class), tretilmi olan snfa da tremi snf(derived class) denir. ekilsel olarak tremi snftan taban snfa bir ok

    olarak belirtilir.

    Tretme ileminin genel biimi:

    class :[private/protected/public] {

    }

    rnek:

    class A {int a;//...

    };

    class B:public A {int b;//...

    };

    ki nokta stste ayracndan sonra istee bal olarak tretme biimiyazlabilir. Yazlmazsa private yazlm gibi ilem grr.

    Tremi snf trnden bir nesne tanmlandnda bu nesne hem tabansnf veri elemanlarn hem de tremi snf veri elemanlarn ierir.

    /*-----turetme.cpp-----*/#include

    class A {

    49

  • 7/29/2019 C++ E-Kitap

    50/101

    public:int a;

    };

    class B:public A {

    public:int b;

    };

    void main(void){

    B x;

    printf("%d\n", sizeof(x));}/*------------------------*/

    Tremi Snf Nesnesinin Bellekteki Organizasyonu

    Tremi snf nesnesinin taban snf veri elemanlar ve tremi snfn kendiveri elemanlar blok olarak ardl bir biimde yerletirilir. Ancak taban snfve tremi snf veri elemanlarnn hangisinin daha dk adres blgesineyerletirilecei ANSI standartlarnda belirlenmemitir, dolaysyladerleyiciyi yazanlara braklmtr.

    A BB A

    Tabii derleyici organizasyonu hep ayn yapar. Yaygn kullanlanderleyicilerde taban snf veri elemanlar dk anlaml adresiyerletirilmektedir(Kursta btn rneklerde nce taban snf verielemanlar dk anlaml adrese yerletirilecektir).

    Tremi Snflarda Eriim Kural

    Tremi snflardaki eriim kural tretme biimine baldr.

    Public Tretmesi

    Public tretmesinde taban snfn public blm tremi snfn publicblmym gibi, taban snfn protected blm de tremi snfnprotected blmym gibi ilem grr. Taban snfn private blmeriime kapaldr. Taban snfn private blmne tremi snf tarafndaneriilemez.

    Taban Tremiprivateprotected protected

    public public

    50

  • 7/29/2019 C++ E-Kitap

    51/101

    Public Tretmesinden kan Sonular

    1. Tremi snf nesnesi yoluyla dardan nokta ya da ok operatrkullanlarak taban snfn public blmne eriilebilir. Ancak tabansnfn protected ve private blmne eriilemez.

    2. Tremi snf ye fonkiyonlar ierisinde taban snfn public veprotected blmlerine dorudan eriilebilir.ancak taban snfn privateblmne eriilemez.

    Protected Tretmesi

    Bu tretme biiminde taban snfn public ve protected blmleri tremisnfn protected blmym gibi ilem grr. Taban snfn privateblm eriime kapaldr. Tremi snf tarafndan eriilemez.

    Taban Tremiprivateprotected protectedpublic

    Protected Tretmesinden kan Sonular

    1. Tremi snf nesnesiyle dardan nokta ya da ok operatryle tabansnfn hibir blmne eriilemez.

    2. Tremi snf ye fonksiyonlar ierisinde taban snfn public veprotected blmlerine dorudan eriilebilir. Ancak private blmlerine

    eriilemez.Private Tretmesi

    Bu durumda taban snfn public ve protected blmleri tremi snfnprivate blmym gibi ilem grr. Taban snfn private blm eriimekapaldr. Tremi snf tarafndan eriilemez.

    Taban Tremiprivateprotected private

    public

    Private Tretmesinden kan Sonular

    1. Tremi snf nesnesi yoluyla dardan nokta ya da ok operatryletaban snfn hibir blmne eriilemez.

    2. Tremi snf ye fonksiyonlar ierisinde taban snfn public veprotected blmlerine dorudan eriilebilir. Ancak private blmlerineeriilemez.

    Tretme leminden kan Ortak Sonular

    1. Tremi snf nesnesi yoluyla dardan nokta veya ok operatr

    51

  • 7/29/2019 C++ E-Kitap

    52/101

    kullanlarak ancak taban snfn public blmne ancak publictretmesiyle eriilebilir. Hibir zaman dardan taban snfn protectedya da private blmne eriilemez.

    2. Tremi snf ye fonksiyonlar ierisinde tretme biimi ne olursa olsuntaban snfn public ve protected blmlerine eriilebilir.

    3. Taban snfn private blm tam olarak korunmutur. Tremi snftarafndan dorudan hibir ekilde eriilemez.

    En ok kullanlan tretme biimi public tretmesidir.

    Protected Blmnn Anlam

    Protected blm dardan dorudan eriilemeyen, ancak tremisnf ye fonksiyonlar tarafndan eriilebilen bir blmdr. Protectedblmnn tretme dnda zel bir anlam yoktur. nk bu blmtremi snfn eitli ilemlerini kolaylatrmak iin gereksinimlerinitutmakta kullanlr.

    Private Blme Fonksiyonlar Yerletirilmesi

    Bir snfn public blmnde bulunan X() isimli fonksiyon ileminigerekletirmek iin ilemin belirli blmlerini yapan, yani ara ilemleriyapan eitli fonksiyonlar kullanabilir. Bu ara ilemleri yapan fonksiyonlarndardan arlmasnn hibir anlam yoktur. Algdan uzak tutmakamacyla private blme yerletirilebilirler. Snf kullanacak kii iinprivate blgenin incelenmesi gereksizdir.

    Somut, Soyut ve Arabirim Snflar

    Kendisinden baka bir snf tretilmeyecek biimde tasarlanan snflarasomut snflar (concreate cleass) denir. Somut snflar belirli bir konudayararl ilemleri yaparlar. Genellikle ilevlerinin geniletilmesi biiminde biristek sz konusu olmaz.

    Soyut snflar (abstract class) kendi bana bir anlam olmayan kendisindentretme yaplarak kullanlmas zorunlu olan snflardr. C++ta soyutsnflar derleyici tarafndan belirli bir syntax iimiyle dorudan

    desteklenirler.

    Arabirim snflar (interface class) en ok rastlanan snflardr. Kendibalarna yararl ilemeleri yapabilen, ancak tretme ilemine de izinverebilecek biimde tasarlanm snflardr. Arabirim snflar tasarlayan kiibunlar tretme durumunu gz nne alarak tasarlamaldr.

    Tretme lemine Birka rnek

    - Seri port ilemlerini yapan serial isimli bir snf olsun. Bu snfn yefonksiyonlar portu set etme, okuma ve yazma gibi temel ilemleriyapsn.Modem seri porta balanarak kullanlan, ve iletiimi salayan bir

    52

  • 7/29/2019 C++ E-Kitap

    53/101

    CWnd publicCDialogCWndpublicCDialogpublicMyDialog

    aratr. Modemi programlamak iin seri porta bilgi gndermek gerekir.Modem ilemlerini yapmak iin serial snfndan tretme uygulanabilir.Benzer biimde laplink kablosu kullanarak seri portlar aras bilgitransferi iin laplink isimli ayr bir snf tretilebilir.

    - MFC snf sisteminde CWnd snf genel olarak her trl pencereyle ilgili

    ilem yapmak amacyla kullanlr. Dialog pencereleri zel pencerelerdir.Yani bir pencerenin tm zelliini gsterir, ancak ek zelliklere desahiptir. CDialog snf CWnd snfndan tretilmitir.

    Ancak her dialog penceresi kendine zg farkllklara sahiptir. MFCde nezaman bir dialog penceresi alacak olsa CDialog snfndan bir snftretilmeli ve dialog penceresi o snfla ilikilendirilmelidir.

    Bu durumda MyDialog snfna ilikin bir nesne tanmlanrsa bu nesneyoluyla CWnd snfna ilikin ye fonksiyonlar arldnda; pencereyeilikin temel ilemler, CDialog snfnn ye fonksiyonlar arldndadialog pencerelerine ilikin genel ilemler ve nihayet MyDialog snfnailikin ye fonksiyonlar arldnda kendi dialog penceremizle ilgili zel

    ilemler yaplacaktr.

    Tremi Snflarda Faaliyet Alan

    Snf faaliyet alan bir snfn ve ondan tremi olan snflarn yefonksiyonlar arasnda tannabilme araldr. Bir veri eleman ya da yefonksiyonu ayn isimle taban ve tremi snflarda tanml olabilir. Budurumda:1. Tremi snf ye fonksiyonu ierisinde ilgili isim dorudan kullanlrsa

    dar faaliyet alanna sahip olan yani tremi snfta tanlanm olananlalr. Eer istenirse znrlk operatryle snf ismi belirtilerek

    (X::a = 10) taban snftaki isme eriilebilir.2. Tremi snf nesnesi yoluyla dardan nokta ya da ok operatryle

    53

  • 7/29/2019 C++ E-Kitap

    54/101

    1FC0

    A 1FC2B

    ayn isimli deikene ya da fonksiyona eriildiinde yine dar faaliyetalanna sahip olan tremi snftaki isim anlalr. Ancak nokta ya da okoperatrnden sonra yine znrlk operatr kullanlabilir (p->X::a).

    3. Taban ve tremi snf ierisinde ayn isimli fakat farkl parametreyaplarna sahip fonksiyonlar olsun. Eer tremi snfn baka birt ye

    fonksiyonunda ayn isimli fonksiyon arlmsa bu fonksiyon yalnzcadar faaliyet alannda aranr. Yani parametre yaplar farkl bile olsa darfaaliyet alanndaki dierini gizlemektedir. Ayn durum dardan tremisnf nesnesi yoluyla nokta ya da ok operatryle de sz konusu olur.

    Yani dar faaliyet alanndaki isim geni faaliyet alann gizleyerek buismin orada aranmamasn salar(Global fonksiyon arrken ::operatr fonksiyon isminin nne getirilir). Bir snfn ye fonksiyonuierisinde bir fonksiyon arm olsun. Derleyici bu ismi srasylauralarda arar(name lookup):a. ye fonksiyona ilikin snf ierisinde,

    b. ye fonksiyonun taban snflar ierisinde,c. Global faaliyet ierisinde aranr.

    Bir ye fonksiyon ierisinde fonksiyon ismi, snf ismi ve znrlkoperatryle arlmsa isim srasyla uralarda aranr:a. sim znrlk operatryle belirtilen snfta aranr.b. Bulunamazsa znrlk operatryle belirtilen snfn taban

    snfnlarnda aranr. Ancak global faaliyet alannda aranmaz.

    Eer unary znrlk operatr ile arlmsa (::fonk(); ) isim yalnzcaglobal faaliyet alannda aranr. Bir snfn ye fonksiyonu ierisinde

    snfn ve taban snflarn global fonksiyonla ayn isimli fonksiyonlarolmasa bile arma ilemi okunabilirlik bakmndan yine unaryznrlk operatr kullanlarak yaplmaldr. Fonksiyonlar iinbelirtilen bu arama durumlarnn hepsi normal deikenler iin degeerlidir.

    Tremi Snfn Taban Snf armas lemleri

    Normal olarak tremi snf taban snfa eriebilir. Yani tremi snfnesnesiyle ya da tremi snf ye fonksiyonlar ierisinde taban snfnesnesi ya da fonksiyonlar kullanlabilir. ancak tersi durum mmkn

    deildir. Yani taban snf tremi snfa eriemez. Taban snf derlenirkenderleyici bundan bir snf tretileceini bilmek zorunda deildir. Budurumda tremi snf nesnesi ile taban snf ye fonksiyonu arldndaderleyici bu fonksiyona this gstericisi olarak tremi snf nesnesinintaban ksmnn adrsini geirir. Uygulamada taban snf veri elemanlar dahadk adrese yerletirildiinden geirilen adres nesnenin btnselbalang adresiyle ayn olur.

    B x;x.fonka();

    Burada A taban snfnn fonka ye fonksiyonuna this gstericisiyle 1FC0adresi geirilmektedir. Tremi snf nesnesiyle tremi snfn ye

    54

  • 7/29/2019 C++ E-Kitap

    55/101

    A CB BA C

    fonksiyonu arldnda yine taban snf veri elemanlarnn bulunduutoplam veri adresi geirilir. nk tremi snf ye fonksiyonu ierisindetaban snf ye fonksiyonu arldnda derleyici taban snf veri bloununadresini tespit edebilmek zorundadr.

    Bir Dizi Tretme Yaplmas Durumu

    Tretme ilemi birden fazla yaplabilir Bu durumda yukardaki snflar aynkurallarla aadan eriilebilir. Bir snfn bir dizi tretme yapldnda birsteki taban snfna dorudan tan snf (direct base class) sonraki tabansnflarna ise dolayl taban snf (indirect base class) denir. Bir snf birdenfazla snofa taban snf olabilir. Bu durum atmaya yol amayacakbiimde ak ve anlalr bir tretme durumudur.

    Ancak bir snffn birden fazla taban snfa sahip olmas ayr bir blmdeincelenecek kadar karmak bir konudur. Bu duruma oklu tretme denir.oklu tretme dier bilgisayar dillerinde desteklenmemektedir.

    Taban Snf Trnden Gstericilere Tremi Snf Nesnelerinin AdreslerininAtanmas

    C++'ta bir gstericiye farkl trden bir gstericinin atanmas uyar deilerror gerektirir. Ancak istisna olarak taban snf trnden bir gstericiyetremi snf trnden bir nesnenin adresi atanabilir. Ancak bunun tersiolan durum, yani tremi snf trnden bir gstericiye taban snftrnden bir nesnenin adresinin atanmas durumu yararl ve geerli birilem deildir.

    class A {

    55

  • 7/29/2019 C++ E-Kitap

    56/101

    ..

    ..};

    class B:public A {

    ..

    ..};

    void main(void){

    A *p; /*Taban snf trnden bir gsterici*/B x; /*Tremi snf trnden nesne*/A y; /*Taban snf trnden bir nesne*/B *t; /*Tremi snf trnden bir gsterici*/

    p = &x; /*Geerli*/t = &y; /*Geersiz*/

    }

    Tremi snf nesnesi taban snf veri elemanlarn ierdiine gre tremisnf nesnesinin adresi taban snf gstericisine geirildiinde problemli yada gvensiz bir durum olumaz. Derleyici bu durumda tremi snfnesnesinin taban snf veri elemalarnn adresini gstericiye atar. Tabansnf gstericisiyle ancak taban snf ye fonksiyonlar arlabileceinegre bu gstericiyle tahsis edilmi bir alana eriilir, yani uygunsuz birdurum olumaz. Mademki taban snf ve tremi snf veri elemanlarnnyerleimi kesin bir standartla belirlenmemitir, byle bir atamada derleyicitremi snf nesnesinin taban snf elemanlarnn balang adresini tespitedip o adresi atamaldr. Tabii genellikle taban snf veri elemanlar dkanlaml adrese yerletirildiinden geirilen adres de nesnenin btnnnbalang adresi olur.

    /*-----tabangos.cpp-----*/#include

    class A {

    int a;public:A(int x = 0){

    a = x;}void DispA(void);void SetA(int x){

    a = x;}

    };

    56

  • 7/29/2019 C++ E-Kitap

    57/101

    class B : public A {int b;

    public:B(int x = 0, int y = 0): A(y){

    b = x;}void DispB(void);void SetB(int x){

    b = x;}

    };

    void A::DispA(void){

    printf("%d\n", a);}

    void B::DispB(void){

    printf("%d\n", b);}

    void main(void){

    A *p;B x(10, 20);

    p = &x;p -> DispA();p -> SetA(50);p -> DispA();

    }/*------------------------*/

    rnek:C B'den, B A'dan tremi snflardr:

    {B *p;C n;

    p = &n; /*Geerlidir, p'ye A'nn balang adresi, geirilir*/}

    Tremi Snf Nesnesinin Adresinin Taban Snf GstericisineAtanmas leminin Program erisinde Karlalabilen eitli

    Durumlar

    Tremi snf nesnesinin adresi ak ya da gizli eitli kodlarla taban snf

    57

  • 7/29/2019 C++ E-Kitap

    58/101

    gstericisine geirilebilmektedir.

    1. Ak bir biimde yaplan atamalarla:

    Yani taban snf trnden bir gsterici tanmlanr, tremi snf trnden bir

    nesnenin adresi atanr.

    {A *p; /*Taban snf trnden bir gsterici*/B x; /*Tremi snf trnden nesne*/

    p = &x; /*Geerli*/}

    2. Fonksiyon arma yoluyla ve gsterici kullanlarak:

    Bu durumda fonksiyonun parametre deikeni taban snf trnden bir

    gstericidir. Fonksiyon tremi snf nesnesinin adresiyle arlr. Bubiimde atama ilemi en sk rastlanan atama ilemidir.

    void fonk(A *p){

    p -> DispA();}

    void main(void){

    B n(10, 20);

    fonk(&n);}

    3. Aka ve referans kullanlarak yaplan atamalar:

    Taban snfa ilikin bir referans tremi bir snfa ilikin bir nesneyle ilkdeer verilerek tanmlanabilir. Derleyici bu durumda tremi snfnesnesinin taban snf veri eleman blounun adresini taban snfreferansna atar.

    {B n(10, 20);A &r = n; /*Geerli*/

    r.Disp(); /*Geerli*/}

    4. Fonksiyon arma yoluyla ve referans kullanlarak:

    Bu durumda fonksiyonun parametre deikeni taban snf trnden bir

    referanstr. Fonksiyon da tremi snf nesnesinin kendisiyle arlr.

    58

  • 7/29/2019 C++ E-Kitap

    59/101

    void fonk(A &p){

    p.DispA();}

    void main(void){

    B n(10, 20);

    fonk(n);}

    Taban Snf Gstericisine Tremi Snf Nesnesin AdresininAtanmasnn Faydalar

    Bir dizi tretme sz konusu olduunda tretme ierisindeki her snfn

    ortak veri elemanlar sz konusu olabilir. rnein yle bir tretme szkonusu olsun:

    (D B'den, E C'den, B ve C de A'dan tremi snflar olsun). rnein buradatretilmi snflarn hepsi A snfn iermektedir. Yani bu snflarn hepsi Asnf gibi de davranabilmektedir. Burada A veri elemanlar zerine genelilemler yapan bir fonksiyon sz konusu olsun:

    void fonk(A *p){

    }

    Tremi snflarn herhangi birine ilikin nesnenin adresiyle bu fonksiyonarlabilir. Yani bylece trden bamsz olarak ilem yapabilenfonksiyonlar yazlabilmektedir.

    Taban Snf Gstericisine Tremi Snf Nesnesinin Atanmasnalikin Birka rnek

    1. Bir iletmede alan kiiler gruplanarak bir snf ile temsil edilmi olsun.

    59

  • 7/29/2019 C++ E-Kitap

    60/101

    alan hangi gruptan olursa olsun onun genel zellikleri zerinde ilemyapan ProcessPersonalInfo() fonksiyonu olsun:

    ProcessPersonalInfo(Employee *p);

    Bu fonksiyona hangi snf trnden nesne verirsek verelim o snfn genelalan zellikleri zerinde ilemler yaplabilir.

    {

    Manager x(....);Salesperson y(...);

    ProcessPersonalInfo(&x);ProcessPersonalInfo(&y);

    }

    2. MFC snf sisteminde her trl pencere zerinde ilem yapabilen birCWnd snf vardr.

    Editbox, puchbutton ve dialog pencereleri de bir eit penceredir. Buzel pencereler zerinde ilem yapabilen CWnd zerinden tretilmi ayrsnflar vardr.

    Pencerenin tr ne olursa olsun, onun genel pencere zellii zerinde ilemleryapan global bir ProcessWnd() fonksiyonu yazldn dnelim. Bu

    fonksiyon her trl pencere zerinde ilem yapabilecektir.

    void ProcessWnd(CWnd *p){

    }

    {CBut