tümüyle cpp

Upload: data4use

Post on 30-May-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 Tmyle CPP

    1/94

    1

    C++ NASIL BR PROGRAMLAMA DLDR?

    C++ nesne ynelimli programlama tekniinin uygulanabilmesi iin C'nin geniletilmibir biimidir. Nesne ynelimli programlama (object oriented programming) teknii ve C++B.Stroustroup tarafndan gelitirilmitir. Tasarm 70'li yllarn ikinci yarsndan balanm olsa

    da btn dnyada yaygnlamas ve kabul grmesi 80'li yllarn sonlarna doru mmknolmutur. Nesne ynelimli programlama teknii(NYP) zellikle byk kodlarn stesindengelebilmek amacyla tasarlanmtr. Tasarm C++ zerinde yaplm olmasna karn bugn

    pek ok yksek seviyeli programlama dilleri bu teknii desteklemektedir. C++ ve nesneynelimli programlama tekniinin enbelirgin uygulama alanlarndan birisi WINDOWS altndaprogramlamadr. WINDOWS karmak ve yksek seviyeli bir iletim sistemidir. WINDOWSaltnda program gelitirebilmek iin uzun kodlar yazmak gerekir. Bu nedenle WINDOWSaltnda C ile deil C++ ile ve NYP tekniini kullanarak program yazmak daha etkin birzmdr. NYP tekniinin uygulanabilmesi iin altmz sistemin kaynaklarnn yeterincegeni olmas gerekir. (Yani hzl bir mikro ilemci, byk RAM ve DISK ve iyi bir iletimsistemi)

    C++'IN C'DEN FARKLILIKLARI

    NYPT LE DORUDAN SINIF YAPISILKS OLMAYANFARLILIKLARI VE

    FAZLALIKLARI

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

    Snf(class) C'deki yap(struct)'lara benzer bir veri yapsdr. NYPT snflar kullanlarak program yazlmas tekniidir. Kursun %80'i snf yapsnn yaps ve kullanlmas zerineayrlmtr.

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

    C++ derleyicileri C derleyicisini de iermek zorundadr. Yani C++ derleyicisi demekhem C hem de C++ derleyicisi demektir. Derleyici dosyann uzantsna bakarak kodun C'de miyoksa C++'ta m yazlm olduuna karar verir. C'de ise uzants c, C++'ta yazlmsa uzantscpp'dir.

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

    Standart C'de yerel deikenler bloklarn banda bildirilmek zorundadr. Yani kme parantezialdktan sonra daha hibir fonksiyon arlmadan ve ilem yaplmadan yaplmaldr. Butasarmn nedeni programcnn bildirimin yerini kolay bulabilmesini salamaya yneliktir.

    Oysa C++'ta yerel deikenler bloun herhangi bir yerinde bildirilebilir. Bir deikeninkullanma yakn bir blgede bildirilmesi C++ tasarmclarna gre daha okunabilirdir.

  • 8/14/2019 Tmyle CPP

    2/94

    2

    (Deiken kavram nesne isimlerini, struct, union ve enum isimlerini ve enum sabitlerini,typedef isimlerini ieren genel bir terimdir.) O halde C++'ta yerel deikenin faaliyet alan

    bildirim noktasndan blok sonuna kadar olan blgeyi kapsar. Ne olursa olsun bir blok ierisindeayn isimli birden fazla deiken bildirimi yaplamaz.

    C++da for dngsnn birinci ksmnda bildirim yaplabilir. rnek olarak:

    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 bildirildiiyerden for dngsnn iinde bulunduu bloun sonuna kadar etkilidir. if, for, switch, whilegibi deyimlerden sonra blok almam olsa bile 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-) C++ta // ile satr sonuna kadar yorumlama yaplabilir.

    C++ta /* */ yorumlama biiminin yan sra kolaylk olsun diye // ile satr sonuna kadaryorumlama biimi de eklenmitir. Son senelerde byle bir yorumlama biimi standart Cde dekullanlmaya balanmtr. Ancak ANSI C standartlarnda tanml deildir. Tanabilirlik

    bakmndan bu yorumlama biimini standart Cde kullanmak tavsiye edilmez.

  • 8/14/2019 Tmyle CPP

    3/94

    3

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

    C de bir fonksiyonun arldn gren derleyici fonksiyonun arlma noktasna kadarfonksiyonun tanmlamasyla ya da prototipi ile karlamamsa 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 fonksiyonun tanmlamasyla ya daprototipiyle karlamas gerekir. Dolaysyla yukardaki kod C++ta errordr. (NOT: CV++ve nesne ynelimli programlama teknii bug oluturabilecek kodlardan kanlmas temelinedayandrlmtr. Yani garanti yntemler kullanlmaldr. Bu sebeple Cdeki pek ok uyarC++ta errore dntrlmtr.)

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

    void fonk(void)

    {

    }

    void fonk(int x)

    {

    }

    Cde ne olursa olsun ayn isimli birden fazla fonksiyon tanmlanamaz. Oysa C++ta parametreyaps sayca ve/veya trce farkl olan ayn isimli birden fazla fonksiyon tanmlanabilir. Aynisimli birden fazla fonksiyon varsa ve o fonksiyon arlmsa gerekte hangi fonksiyonarlm olduu arlma ifadesindeki parametre yaps incelenerek belirlenir. Yaniarlma ifadesindeki parametre says ve tr hangisine uygunsa o arlm olur. Geri dndeerinin farkl olmas ayn isimli fonksiyon yazmak iin yeterli deildir. Yani geri dndeerleri farkl fakat parametre yaps ayn olan birden fazla fonksiyon tanmlanamaz.

    #include

    void fonk(int x)

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

  • 8/14/2019 Tmyle CPP

    4/94

    4

    }

    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 karar verememesind endolay error durumuyla karlalr. Bu tr hatalara iki anlamllk hatalar denir. Yukardakirnekte fonk(3.2); gibi bir arma yaplrsa 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 saysarlma ifadesine uygun tek bir fonksiyon varsa bu durumda tr uyumasna baklmaz. Cdeolduu gibi otomatik tr dntrmesi yaplarak o fonksiyon arlr.

    C++ derleyicisi ayn sayda parametrelere sahip birden fazla ayn isimli fonksiyonun bulunmasdurumunda arlma ifadesine tr bakmndan uygun 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 short int parametreye sahipbir fonksiyon yok ancak int parametreye sahip bir fonksiyon varsa int parametreye sahip

    olan fonksiyon arlr.2. Fonksiyon float parametreyle arlmsa ancak float parametreye sahip bir fonksiyon yok

    double parametreye sahip bir fonksiyon tanmlanmsa bu durumda double parametreyesahip olan fonksiyon arlr.

    3. Fonksiyon ayn trden const olmayan bir ifadeyle arlmsa ancak ayn trden constparametreye sahip bir fonksiyon y,tanmlanmsa tr uyuumunun saland kabul edilirve const parametreye sahip olan fonksiyon arlr.

  • 8/14/2019 Tmyle CPP

    5/94

    5

    Cde ve C++ta tanmlanan ve arlan bir fonksiyon ismi .obj modl ierisine yazlmakzorundadr. .obj modl standardna gre ayn isimli birden ok fonksiyon modl ierisineyazlamaz. Standart C derleyicileri fonksiyon isimlerinin bana bir _ ekleyerek obj modlnierisine yazarlar. Oysa C++ derleyicileri fonksiyon isimlerini parametre trleriyle kombineederek obj modl ierisine yazarlar. Bu durumda C++ta ayn isimli farkl parametrelere 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. Standart C fonksiyonlar libdosyalarnn ierisine banda _ bulunarak yani standart C kurallaryla yazlmlardr. Oysa

    bu fonksiyonlarn C++tan arlmasyla bir uyumsuzluk ortaya kar. nk C++ derleyicisiarlan fonksiyonu obj modl ierisine bana _ koyarak deil parametre trleriyle kombineederek yani C++ kurallaryla yazar. extern C bildirimi bir fonksiyonun prototipinin nne yada 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 olur. Bir grup fonksiyon yazmkolayl salamak iin extern C blou iine alnabilir.

    extern C {void fonk(void);

    void sample(void);

    ....

    }

    Bloun ierisinde baka bildirimler ve kodlar bulunabilir. Ancak derleyici yalnzca bu blounierisindeki fonksiyonlarla ilgilenir. Bu durumda standart C balk dosyalarnn ierisinde

    fonksiyonlarn extern C bildirimiyle prototipleri yazlm olmas gerekir. Ayn dosya hem Chem C++ta include edilip kullanlabildiine gre ve extern C bildirimi sadece C++ iingeerliyse bir problem ortaya kmaz m? Bu problem nceden tanmlanm cplusplussembolik sabitiyle zmlenmitir:

    #ifdef cplusplus

    extern C {#endif

    .....

    .....

    .....

    .....

    .....

    Fonksiyon

    prototipleri

  • 8/14/2019 Tmyle CPP

    6/94

    6

    .....

    #ifdef cplusplus

    }

    #endif

    Bir de extern C++ bildirimi vardr. Bu bildirim fonksiyon isimlerinin C++ kurallarna greobj modln ierisine yazlacan anlatr. Zaten fonksiyonlar default olarak bu kurala greyazlrlar. Bu bildirim ileriye doru 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, o halde dinamik bellek ynetimi malloc, claloc, realloc ve free fonksiyonlaryla yaplabilir. Ancak bufonksiyonlar nesne ynelimli programlama tekniini uygulayabilmek iin tasarlanmamtr. Buyzden C++ta yeni bir teknik kullanlmaktadr. C++ta dinamik olarak tahsis edilme

    potansiyelindeki bo blgelere free store denilmektedir(standart Cde heap denir).

    new Operatr

    Genel biimi:

    new []

    new int

    new char

    new double [10]

    new float[n]

    new char[strlen(s) + 1]

    Eer keli parantez olmadan sadece tr ismi ile tahsisat yaplrsa o trden bir elemanlk yertahsis edilmi olur. rnein:

    new int1 intlik yer tahsis edilmitir.

    Eer keli parantez ierisine ifade yazlarak kullanlrsa bu durumda o ifade ile belirtilensayda elemanlk alan tahsis edilir. new operatr tr belirli bir alan tahsis eder. Yani new

    operatryle elde edilen adresin tr bileeni arlma ifadesindeki tr ile ayn olur.int *p;

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

    /* alann balang adresi elde ediliyor. Bu adres int trndedndir. */

    char *p;

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

    /*----------new1.cpp---------*/

    #include #include

  • 8/14/2019 Tmyle CPP

    7/94

    7

    void main(void)

    {

    char *p;

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

    puts(p);

    }

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

    New bir operatrdr. Ancak derleyici bu operatr kullanldnda dinamik tahsisat ilemininyaplmasn salamak iin dinamik tahsisat yapan bir fonksiyonun arma kodunu ama kodaekler. Yani new bir operatr olmasna karn tahsisat ilemi yerletirilen bu fonksiyonsayesinde programn alma zaman srasnda yaplmaktadr. Bu operatr ncelik tablosununikinci dzeyinde bulunmaktadr. rnein:

    new int + ngibi bir ilem geerlidir. lemler:lem 1 : new intlem 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 fonksiyonun kullanl*/

    #include #include

  • 8/14/2019 Tmyle CPP

    8/94

    8

    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;

    }

    void main(void)

    {

    char *p;

    p = getname();

    puts(p);

    }

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

    delete OPERATR

    Delete operatr new operatryle tahsis edilmi olan bloklar serbest brakmak iinkullanlr. Genel biimi:

    1. delete p;2. delete [] p;Eer tahsisat tek para olarak yaplmsa yani keli parantez kullanlmadan yaplmsa silmeilemi keli parantez kullanlmadan yaplmaldr. rnein:

    int *p;p = new int;

    delete p;

    Eer tahsisat ilemi birden fazla eleman iin yaplmsa yani keli parantez kullanlarakyaplmsa serbest brakma ileminde de keli parantez kullanlmaldr. rnein:

    int *p;

    p = new int[n];

    delete [] p;

    Burada keli parantez ierisine bir ey yazlmaz. delete operatr unary prefix bir operatrdrve ncelik tablosunun ikinci dzeyinde bulunur.

  • 8/14/2019 Tmyle CPP

    9/94

    9

    delete p + 1; /*Hatal*/delete (p + 1);/*Doru*/

    Delete operatrnn operand daha nce tahsis edilmi olan bloun balang adresi olmaldr.

    Deilse beklenmeyen sonular ortaya kabilir. Tabii derleici delete operatrne karlk amakoda (object modulee) free gibi tahsis edilmi blou serbest brakan bir fonksiyon koduyerletirmektedir. new delete operatrlerinin tahsisat ilemlerinde kulland fonksiyon maloc,calloc, free fonksiyonlar olmak zorunda deildir. Bu iki grup fonksiyon farkl tahsisat tablolarkullanyor olabilir. Bu nedenle new delete operatrleriyle malloc, calloc, free gibi standart Cfonksiyonlarn zel bir durum yoksa birlikte kullanmamak gerekir. nk bir grup tarafndantahsis edilen alan dier grup tarafndan tahsis edilmemi gibi gzkebilir.

    Grld gibi C++ta realloc fonksiyonun karl bir operatr yoktur. Ancak byle birfonksiyon 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)e bytld */

    set_new_handler FONKSYONU

    Normal olarak new oparetr baarszlkla sonulandnda 0 adresine geri dner ve bu adresin

    test edilmesi gerekir. Ancak her new kullanmnda bu adresin test edilmesi yerine daha etkin biryntem kullanlmaktadr. new operatr baarsz olduunda set_new_handler fonksiyonu ilebelirlenen fonksiyonu armaktadr. Bylece her defasnda kontrol yaplmasna gerek kalmaz.

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

    set_new_handlera parametre olarak geri dn deeri void parametresi void olan birfonksiyonun adresi verilir. Artk baarszlk durumunda bu fonksiyon arlacaktr. newoperatr baarszlk durumunda belirlenen fonksiyonu arr ve bu fonksiyon arldktansonra tekrar tahsisat ilemini yapar. Yine baarsz olursa tekrar fonksiyonu arr ve bu byledevam eder. Yani aadaki algoritmadaki gib alr:

    for(;;){ if(boyer var m)

  • 8/14/2019 Tmyle CPP

    10/94

    10

    return boyer;else

    set_new_handler();

    }

    /*-----------snhandle.cpp---------------*/#include

    #include

    #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 bir bilginin bir

    gstericiye atanmas durumu uyar deil error olarak deerlendirilir.

    Adres ilemlerinde tr uyumazlklar C++ta eror olarak deerlendirilir. Oysa standart Cderleyicileri byle durumlarda en fazla uyar verirler. Ancak void gstericiye herhangi birtrden adres atanabilir. Fakat void bi adresin herhangi bir gstericiye atanmas error olarakdeerlendirlir(bu durum 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; /* Cannotconvert 'int *' to 'char *' hatasn verir */

  • 8/14/2019 Tmyle CPP

    11/94

    11

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

    }

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

    Benzer biimde const bir deikenin adresi ancak const bir gstericiye 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 const deiken kullanldndaderleyici eer const deikene ilk deer sabit ifadesiyle verildiyse derleyici dorudan o sabit

    ifadesini kullanr. Tabii const deikene verilen ilk deer sabit ifadesi deilse bu constadeiken kullanldnda derleyici dorudan bir say yerletiremez, const deikenin kendisiniyerletirir.

    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 const deikenin adresi alnabilir.Bu yolla const deikenin ierii de deitirilebilir. Tabii bu deitirme programn almazaman ierisinde olduundan 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 verme zorunluluu yoktur.

    Global deikenler ve statik yerel deikenler gibi statik mrl deikenlere ilk deer Cde

    sabit ifadesiyle verilmek zorundadr. nk statik mrl deikenler ama kod ierisine ilkdeerleriyle yazlrlar. Exe dosyasnn ierisinde yer alrlar. Bununmmkn olabilmesi iin

  • 8/14/2019 Tmyle CPP

    12/94

    12

    verilen ilk deerlerin derleme aamasnda belirlenmi olmas gerekir. Derleme aamasndatespit edilmesi iin ifadenin sabit ifadesi olmas gerekir. Oysa C++ta statik mrldeikenlere her trden sradan bir ifadeyle ilk deer verilebilir. Bu deikenler 0 ilk deeriyleama koda yazlrlar. Programn alma zaman srasnda ve main fonksiyonundan nce ilkdeerini alrlar.

    10-)Parametre deikenlerinin default deerler almas(default function arguments)

    C++ta fonksiyon arlrken bir parametre belirtilmemise ona ilikin parametre deikenidefault bir deer alabilir. Byle bir durum Cde yoktur. Bir parametre deikeninin defaultdeer almas durumu fonksiyon tanmlanrken ya da prototip bildiriminde parameredeikeninden sonra eittir 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 bulunanlarn hepsi default deerleralmak 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 arlma ifadesinde parametreyazlmak zorundadr. Default deer alan parametre deikenlerine sahip fonksiyonlarla aynisimli baka fonksiyonlarn birlikte bulunmas durumunda iki anlamllk hatalar oluabilir. kianlamllk hatalar fonksiyonlarn tanmlanmas sonucunda deil arlmas sonucunda ortayakmaktadr.

    /* ki anlamllk hatas rnei */#include

    void fonk(int x, int y = 20)

  • 8/14/2019 Tmyle CPP

    13/94

    13

    {

    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 Fonksiyonlarn Kullanlma Nedenleri

    ok sayda parametrelere sahip fonksiyonlar sz konusu ise ve bu parametre deikenlerininbelli blmne arma srasnda ayn deerler atanyorsa default parametre deikenlerininkullanlmas byk bir yazm kolayl salar. Fazla sayda parametrenin yazlmamas hem

    programcnn i ykn azaltr, hem de okunabilirlii arttrr.

    #include

    #include

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

    {

    return itoa(n, str, base);

    }

    void main(void)

  • 8/14/2019 Tmyle CPP

    14/94

    14

    {

    char s[100];

    myitoa(123, s);

    puts(s);

    }

    Default deer alan parametre deikeni kullanlrken dikkat etmek gerekir. Bir fonksiyon % 90ayn parametre deerleriyle arlyorsa default parametre deikeni kullanlmaldr. Hibirdeer almayacana bari u deeri alsn fikriyle kullanlmamaldr. Bylesi kullanmlar koduinceleyen kiiyi yanltrlar. Bazen parametre deikenine verilen default deerin zel bir anlamolmaz. Bu default deer fonksiyonun default parametreyle arlp arlmadn tespit etmekamacyla kullanlr. Gerek default deerler fonksiyonun ierisinde ve bir dizi ilemlerle eldeedilir. 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 Sahip Fonksiyonlarn Prototipleri

    Byle fonksiyonlarn prototiplerinde dafault parametre deerleri belirtilmelidir. Prototip yazmailemi deiken isimlerini kullanarak ya da kullanmayarak yaplabilir. rnein aadaki ikiprototip 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 ierisindedeilse) tanmlama srasnda bir daha bu default deerler yazlamaz. Yani default deerler ya

    prototipte ya da tanmlama srasnda belirtilmek zorundadr. Her ikisinde birdenbelirtilemezler. Tavsiye ediln kullanm prototipte belirtilmesi, tanmlama da belirtilmemesidir.

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

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

    {}

  • 8/14/2019 Tmyle CPP

    15/94

    15

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

    {

    }

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

    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 ierisinde adres bilgisi bulunur.Derleyici bir referans tanmlandnda ilk deer olarak verilen nesnenin adresini referansn

    ierisine yerletirir. Referanslar iyi anlayabilmek iin onlarn edeer gsterici karlklarndnmek gerekir. E deer gsterici karl referans yerine gsterici kullanldnda eldeedilecek e deer kod anlamna gelir.

    int a = 10;

    int &b = a;

    Edeer karl:

    int a = 10;

    int *b = &a;

  • 8/14/2019 Tmyle CPP

    16/94

    16

    Bir referans ilk deer verildikten sonra kullanldnda artk referans ierisindeki adres deilreferans ierisindeki adreste bulunan bilgi temsil edilir.

    /*----------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

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

    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 bir referans ayn trdenbir nesneyle ilk deer verilerek tanmlanmak zorundadr, o halde parametresi referans olanfonksiyonlar ayn trden bir nesnenin kendisiyle arlmak zorundadr.

    /* fonksiyon parametresi olan referans rnei */

  • 8/14/2019 Tmyle CPP

    17/94

    17

    #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. Oysa C++ta byle birarma fonksiyonun parametre deikeni bir referans ise a paametresini deitirebilir. Klasik

    bir C bak asyla parametre olan ann deitirilmeyecei sanlabilir. Okunabilirliikuvvetlendirmek iin eer parametreyi deitirecek bir fonksiyon tasarlanacaksa bunun iin

    referans deil gsterici kullanlmaldr. Fonksiyonun parametre deikeni referans ise derleyicitarafndan otomatik olarak yaplan bir adres aktarm sz konusudur.

    Referans uygulamas Gsterici edeeriint 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

  • 8/14/2019 Tmyle CPP

    18/94

    18

    #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)

    {

    int a = 10;

    int &b = a;

    printf("%p %p\n", &a, &b);

    }

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

    Bir referans & operatryle adres alma ilemine sokulabilir. Bu durumda elde edilen deerreferans ierisinde bulunan adreste bulunan nesnenin adresidir. Bu da referans ierisindekiadresle ayn olmak zorundadr. Bir referansn da bir adresi vardr. Ama o adres deeri geerli

    bir ifdade ile elde edilemez. r bir referans olmak zere & &r; ifadesi geerli deildir. nk buifadenin edeer gsterici karl & &*p;dir ve &*p bir nesne deildir.

  • 8/14/2019 Tmyle CPP

    19/94

    19

    Yap Deikenlerinin Referans Yoluyla Fonksiyonlara Geirilmesi

    Bir yap deikeninin fonksiyona aktarlmasnda doru teknik yap deikeninin adresininfonksiyona geirilmesidir. Yani fonksiyon yap deikeninin adresiyle arlr, fonksiyonun

    parametre deikeni o yap trnden bir gsterici olur. Fonksiyonun ierisinde elemana ok(->)

    operatryle eriilir. Ancak C++ta ayn etkinlikte olmak zere referansla aktarm da szkonusudur. Yani fonksiyon yap deikeninin kendisiyle arlr. Fonksiyonun parametredeikeni o yap trnden bir referans olur. Fonksiyon ieriisnde elemana nokta operatryleeriilir.

    /*----------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);

    }

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

    Yaplarn referans ya da gsterici yoluyla fonksiyonlara aktarlmas tamamen edeerkullanmlardr.

    const Referanslar

    Bir referans da const olarak tanmlanabilir.

    Referans rnei Gsterici edeeriint 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 gstericiye edeerdir. Yani bylereferanslar sol tarafa deeri olarak kullanlamaz. nk referans ierisinde bulunan adresteki

    bilgi const yaplmtr. Const referanslar da okunabilirlii arttrmak amacyla fonksiyonparametresi olarak kullanlrlar.

    void disp(const struct PERSON &r);

  • 8/14/2019 Tmyle CPP

    20/94

    20

    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 derleyici tarafndan tahsis edilengeici bir blgeye yaplan atama ilemidir. Yani return ifadesi nce geici bir blgeyeyerletirilir, sonra oradan alnarak kullanlr. Fonksiyonun geri dn deerinin tr bu geici

    blgenin trdr. Bir fonksiyonun geri dn deeri referans olabilir. Bu durumda fonksiyonungeri dn deerine ilikin geici blge referans trndendir. Bir referansa bir nesneyle ilkdeer verileceine gre byle fonksiyonlar return ifadelerinin de nesne olmas gerekir.

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

    #include

    int a = 10;

    int *fonk(void)

    {

    return &a;

    }

    void main(void)

    {

    *fonk() = 20;

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

    }

    /*------referan4.cpp-----*/

    #include

    int a = 10;

    int &fonk(void)

    {

    return a;

    }

    void main(void)

    {

    fonk() = 20;

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

    }

    Artk bu fonksiyon kullanldnda referans kullanlyor gibi ilem greceinden returnifadesindeki nesne anlalr. Byle fonksiyonlarn geri dn deeri nesne belirtir ve sol tarafdeeri olarak kullanlabilir. zetle referansa geri dnen bir fonksiyonun geri dn deerikullanldnda return ifadesindeki nesnenin kullanld anlalr.

    Bir Referansa Farkl Bir Trden Bir Nesneyle lk Deer Verilmesi Durumu

    Byle bir durumda nce referansla ayn trden geici bir deiken yaratlr. Verilen ilk deeribu geici deikene atar, tabii otomatik tr dntrlmesi olur ve yaratlan bu geici blgeninadresi referansa aktarlr.

    /*-----referan5.cpp-----*/

  • 8/14/2019 Tmyle CPP

    21/94

    21

    #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 ilk deer olarak verilensa taraf deeri derleyici tarafndan oluturulan geici bir blgenin ierisine aktarlr. Geici

    blgenin adresi de referansa yerletirilir.

    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 kanmak gerekir. Her ikidurumda 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. Oysa C++ta enum trayr bir trdr ve enum trnden deikenlere ancak enum trnden sabitler atanabilir.

  • 8/14/2019 Tmyle CPP

    22/94

    22

    SINIFLAR(classes)

    Snflar nesne ynelimli programlama tekniini uygulayabilmek iin mutlaka 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 terimi daha ok bir snf trnden deikenianlatmakta kullanlr. Nesne ynelimli programlama teknii snflar kullanlarak programyazma tekniidir).

    Snf Bildiriminin Genel Biimi:

    class [snf_ismi] {[private:]

    ...

    ...

    [protected:]

    ...

    ...

    [public:]

    ...

    ...

    };

    Bir snf 3 blmden oluur:1. Private2. Protected3. PublicBir blm blm belirten anahtar szck ve iki nokta st ste ile balatlr, baka bir blm

    belirten szce kadar srer. Birden fazla ayn blm belirten anahtar szck ayn snf bildirimi ierisinde kullanlabilir. Blm belirten anahtar szcklerin biri ya da hibirisiyazlmak zorunda deildir. Snf hibir blm belirten anahtar szckle balatlmamsa private

    blm anlalr. Okunabilirlik asndan snf isminin ilk harfi byk geri kalan harfleri kkyazlr. Bir yap yalnzca veri elemanlarna sahiptir. Snflar hem veri hem fonksiyon ieren veri

    yaplardr. Yani normal yaplardan snflarn fazlalklar ayn zamanda fonksiyon daiermeleridir. Snf ierisinde bildirilen deikenlere snfn veri elemanlar(data member) snfierisinde bildirilen fonksiyonlara ise snfn ye fonksiyonlar(member function) denir(dahayksek seviyeli nesne ynelimli dilllerinde metod ismi de kullanlr). Veri elemanlar ve yefonksiyonlar snfn herhangi bir yerinde yazlabilir. ye fonksiyonlarn sadece prototiplerisnf ierisine konur. Tanmlamalar snf bildiriminden sonra yaplr. Ancak genellikle

    protected blm pek kullanlmaz, snfn veri elemanlar private blme ye fonksiyonlarpublic blme yazlr.

    Bir Snf Trnden Nesnenin Tanmlanmas

    Genel biimi:

  • 8/14/2019 Tmyle CPP

    23/94

    23

    [class] ;

    class Sample x;

    Sample y;

    Class anahtar szc yazlmayabilir. C++ta yap trnden nesne tanmlarken struct anahtarszc de kullanlmayabilir. Bir snf nesnesi iin snfn toplam veri elemanlar kadar yerayrlr.

    /*-----class1.cpp-----*/

    #include

    class Sample {

    private:

    int a, b;

    public:

    void fonk(void);};

    void main(void)

    {

    Sample x;

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

    }

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

    ye Fonksiyonlar Tanmlanmas

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

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

    void Sample::fonk(void)

    {

    }

    ki tane iki nokta stste C++a zg bir operatrdr. ye fonksiyonlar ama koda parametretrleri ve snf isimleriyle kombine edilerek yazlrlar. Yani ayn isimli ve ayn parametreyapsna sahip bir ye fonksiyonu ve global bir fonksiyon tanmlanabilir. Hibir snfa aitolmayan fonksiyonlara global fonksiyon denir.

    Snfn Veri Elemanlarna ve ye Fonksiyonlarna Eriim

    Snfn veri elemanlarna ve ye fonksiyonlarna nokta operatryle eriilir. Bir ye fonksiyonuancak ayn snf trnden bir nesneyle arlabilir. Eer nesne olmadan arlrsa global birfonksiyonun arld anlalr.

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

  • 8/14/2019 Tmyle CPP

    24/94

    24

    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");

    }

    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 olursa olsun btn verielemanlar ve ye fonksiyonlarna dorudan eriilebilir. Yani snfn veri elemanlar snfn yefonksiyonlar arasnda ortak olarak kullanlmaktadr. Bir ye fonksiyon ierisinde kullanlanye fonksiyonlar o ye fonksiyon hangi snf nesnesiyle arlmsa o snf nesnesinin

    elemanlar olur./*-----class3.cpp-----*/#include

    class Sample {

    public:

    int a;

    public:

    void fonk1(int x);

    void fonk2(void);

    };

    void Sample::fonk1(int x)

  • 8/14/2019 Tmyle CPP

    25/94

    25

    {

    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);

    Sample Y;

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

    Y.fonk2();

    }

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

    Bir ye fonksiyonu ierisinde snfn bir dier ye fonksiyonu da dorudan arlabilir. Snfna ye fonksiyonu X nesnesiyle arlm olsun, a ye fonksiyonu ierisinde b ye fonksiyonudorudan arlabilir. Bu durumda b ye fonksiyonu ierisinde kullanlan veri elemanlar Xsnf nesnesine ilikindir.

    /*-----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);

    }

  • 8/14/2019 Tmyle CPP

    26/94

    26

    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 alan2. Fonksiyon faaliyet alan3. Dosya faaliyet alanCde ve C++ta ayn faaliyet alanna ilikin birden fazla deiken ayn isimle tanmlanamaz.Ancak farklfaaliyet alanna ilikin ayn isimli birden fazla deiken tanmlanabilir. Bir blokierisinde birden fazla ayn isimli deiken faaliyet gsteriyorsa o blok ierisinde dar faaliyetalanna sahip olan eriilebilir.

    C++ta snf faaliyet alan diye isimlendirilen ayr bir faaliyet alan daha tanmlanmtr. Snffaaliyet alan fonksiyon faaliyet alan ile dosya faaliyet alan arasnda bir alana sahiptir. Snffaaliyet alan yalnzca bir snfn tm ye fonksiyonlar arasnda tannma araldr. Snfn verielelamanlar ve ye fonksiyon isimleri snf faaliyet alanna uyarlar. Bir snfn veri elemanylaayn isimli snfn ye fonksiyonu ierisinde ayn isimli bir yerel deiken tanmlanabilir. Budurumda fonksiyon ierisindeki blokta yerel olana eriilir. Benzer biimde bir ye fonksiyonierisinde bir fonksiyon arlmsa arlan fonksiyon ile ayn isimli hem global hem de birye fonksiyon varsa dar faaliyet alan kuralna gre ye fonksiyon arld varsaylr.

    znrlk Operatr(::)(scope resolution operator)

    :: operatrne znrlk operatr denir. Bu opertrn hem binary-infix hem de unary-prefixolarak kullanlan tipleri vardr.

    1. Binay infix resolution operatr:Bu kullanmda sol tarafndaki operandn bir snf ismi, sa tarafndaki operandn ise veri

    eleman ya da fonksiyon ismi olmas gerekir. Bu operatr snfn faaliyet alan probleminden dolay gizlenmi olan veri elemanna ya da ye fonksiyonuna eriiminisalar.

    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:

  • 8/14/2019 Tmyle CPP

    27/94

    27

    Bu durumda operand global bir deiken ya da fonksiyon ismi olabilir. Bu haliyel buoperatr faaliyet alan probleminden dolay global olana eriimi salar. Bu operatr nceliktablosunun en yksek dzeyinde bulunur.

    Balang ve Biti Fonksiyonlar

    1. Balang Fonksiyonlar(constructors)Bir snf destesi tanmlandnda derleyici tarafndan otomatik olarak arlan fonksiyonasnfn balang fonksiyonu denir. Yerel bir snf nesnesi programn ak tanmlama noktasnageldiinde, global bir snf nesnesiyse program bellee yklenir yklenmez yaratlr. Balangfonksiyonun ismi snf ismiyle ayn olmaldr. Balang fonksiyonlarnn geri dn deerigibi bir kavram yoktur. Yani geri dn tr yerine bir ey yazlmaz. bu durum int ya da voidanlamna gelmez. Balang fonksiyonlar ierisinde return anahtar szc kullanlabilir,ancak yanna bir ifade yazlamaz. C++ta farkl parametre yapsna sahip birden fazla balangfonksiyonu olabilir. Parametresi olmayan(yani void olan) balang fonksiyonuna default

    balang fonksiyonu(default constructor) denir. Eer snf nesnesi nesne isminden sonra parantez almadan yani normal bir biimde tanmlanm ise (rnein: X n;) bu durumdavarsaylan balang fonksiyonu arlr. Eer nesne isminden sonra bir parantez alr veierisine bir parametre listesi yazlrsa (rnein: X n(10);) parametre listesine uygun olan

    balang fonksiyonu arlr.Uyar: Nesne isminden sonra parantez alp iine hibirey yazlmazsa bu durumda

    varsaylan balang fonksiyonu arlmaz. Bu ifade bir fonksiyon prototipi anlamna gelir.rnein:

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

    Global snf nesnelerine ait balang fonksiyonlar main fonksiyonundan nce arlr. Dahayukarda tanmlanan daha nce arlacak bir biimde sralama sz konusudur.

    2. Biti Fonksiyonu(destructor)Bir nesne faaliyet alann bitirmesiyle bellekten silinir. Yerel deikenler programn aktanmlandklar bloun sonunda, global deikenler ise programn bitimiyle bellekten silinirler.Bir snf nesnesi bellekten silinecei zaman otomatik olarak arlan fonksiyona bitifonksiyonu(destructor function) denir. Biti fonksiyonunun ismi snf ismiyle ayndr, anck

    bana bir ~ sembol getirilir. Biti fonksiyonunun da geri dn deeri gibi bir kavram yoktur.

    Biti fonksiyonu en az ve en fazla bir tane olabilir. Parametresi void olmak zorundadr. Yaniparametresi olmamak zorundadr. Varsaylan biti fonksiyonu diye bir kavram yoktur. Globalbir snf nesnesine ait biti fonksiyonu programn sonucunda main bittikten sonra yani maininsonunda altrlr. Balang ve biti fonksiyonlarnn arlma sralar her zaman terstir. a ve

    b herhangi trden iki snf nesnesi olmak zere balang fonksiyonlar nce a sonra b olacakeklinde arlyorsa biti fonsiyonlar nce b sonra a eklinde arlr(LIFO sistemi).

    Balang ve Biti Fonksiyolarnn Bulundurulma Kural

    Snfn biti fonksiyonu olmak zorunda deildir. Yani varsa arlr yoksa arlmaz. Bir snfnesnesinin tanmlanma biimine uygun bir balang bir fonksiyonu olmak zorundadr. Ancak

    snfn hibir balang fonksiyonu yoksa ve nesne varsaylan balang fonksiyonu arlacakbiimde tanmlanmsa bu durum istisna olarak hata oluturmaz. Ancak snfn herhangi bir

  • 8/14/2019 Tmyle CPP

    28/94

    28

    balang fonksiyonu varsa fakat varsaylan balang fonksiyonu yoksa varsaylan fonksiyonuaracak biimdeyaplacak bir tanmlama hata ile sonulanr.Balang ve Biti Fonksiyonlarnn Kullanlma Nedenleri

    Nesne ynelimli programlama da bir snf belirli bir amac gerekletiren bir ktphane olarak

    ele alnabilir. rnein seri port ilemlerini yapan bir snf tasarlanabilir. Fare ilemleri iin ayrbir snf yazlabilir. Bu snflarn faydal ilemleri yapan bir takm ye fonksiyonlar olmaldr.Bu ye fonksiyonlar snfn veri elemanlarn ortak olarak kullanrlar. Bir snf bir takm yararlileri yapmaya aday ise o yararl ilemleri gerekletirmek iin baz hazrlk ilemlerigerekebilir. rnein seri port ile ilgili ilem yapan bir snfta seri portun set edilmesi, fareilemleri yapan snfta farenin reset edilmesi dosya ilemleri yapan bir snfta dosyann almas

    bu tr hazrlk ilemleridir. Bu hazrlk ilemleri snfn balang fonksiyonu ierisindeyaplrsa snf kullanan kod klr, ayrntlar gz ard edilir ve alglamaiyiletirilir(abstraction). rnein dosya ilemleri yapan snfn balang fonksiyonu ierisindedosya alabilir. Nesne tanmlanr tanmlanmaz hazrlk ilemlerinin otomatik olarak yaplmassnf kullanan kiilerin de ilerini kolaylatrr.

    Biti fonksiyonu balang fonksiyonuyla yaplan hazrlk ilemlerinin otomatik bir biimdegeri alnmas iin kullanlr. rnein dosya ilemlerini yapan snfn biti fonksiyonu otomatikolarak kapayabilir. Seri port ilemlerini yapan snfn biti fonksiyonu port ayarlarn eskidurumuna getirebilir. Tabii baz durumlarda hazrlk ilemlerinin geri alnmas gerekmeyebilir.Yani balang fonksiyonunun olmas biti fonksiyonunun olmasn mantksal bakmdangerekli klmaz.

    Snflarda Temel Eriim Kurallar

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

    1. Bir snf nesnesi yoluyla dardan nokta ya da ok operatrn kullanarak snfn yalnzcapublic blmnde bildirilen veri elemanlarna ya da fonksiyonlarna eriilebilir. Privateveya protected blmlerine eriilemez.

    2. Snfn ye fonksiyonu hangi blmde bildirilmi olursa olsun snfn her blmndeki verielemanlarna ve ye fonksiyonlarna eriebilir. Yani ye fonksiyonlar ierisinde snfn her

    blmndeki veri elemanlarn kullanabilir ve ye fonksiyonlarn arabiliriz.

    Genellikle snfn veri elemanlar snfn rivate blmnde ye fonksiyonlar ise publicblmde tutulur. Bylece veri elemanlarna dardan dorudan eriilemez. Dardan dorudan

    ye fonksiyonlara eriilir. ye fonksiyonlar veri elemanlarna eriirler. Yani veri elemanlarnadorudan deil ye fonksiyonlar yoluyla eriilmesi istenmitir. Eer private blgedeki verielemanlarnn deerlerini almak ya da bunlara deer yerletirilmek istenirse bunlarla ilikikuran bir grup get ve set fonksiyonu yazmak gerekir.

    Yeniden kullanlabilirlik(reusability) nesne ynelimli programlama tekniinin anahtarkavramlarndan birisidir. Bu kavram yazlm olan bir kodun zellikle de bir snfn baka

    projelerde tekrar yazlmadan kullanlmas anlamna gelir.

    Veri Elemanlarnn private, ye Fonksiyonlarnn public Ksmna Yazlmas

    Genellikle snflarda veri korumas istendii zaman snfn veri elemanlar private blgeye yefonksiyonlar ise public blgeye yazlrlar. Snfn veri elemanlarnn private blgeye

  • 8/14/2019 Tmyle CPP

    29/94

    29

    yerletirilmesi dardan onlara dorudan eriimi engeller. Onlara public blgedeki bir grup yefonksiyon ile eriiriz. Normalde tasarlanm olan bir snf ok deiik ve uzun kodlardakullanlabilir. Yani snf kullanan kodlar snfn kendi kodlarndan ok daha fazladr. Eer verielemanlarn private blgeye yerletirirsek o veri elemanlarnn genel yapsnda deiiklikolduunda snf kullanan kodlar deitirmek zorunda kalmayz. Yalnzca prototipleri ayn

    kalmak zere snfn ye fonksiyonlarn yeniden yazmak zorunda kalrz. Oysa veri elemanlarpublic blgeye yerletirilseydi, dardan bu elemanlara dorudan eriilebilirdi ve veri yapsdeitiinde onu kullanan tm kodlar deitirmek gerekirdi. eitli veri elemanlarn ve yefonksiyonlar private blgeye yerletirmekle onlar snf kullanan kiinin algsndan uzaktutarz. Kiiler eriemeyecekleri bilgileri incelemezler. Bu durumda nesne ynelimli

    programlama tekniinde veri gizleme(data hiding) denir. Tabi veri elemanlarnn privateblgeye yerletirilmesi bunlara eriimi zorlatrr. nk eriim dorudan deil, ara birim yefonksiyonlarla yaplr. Snfn veri yaps deitirilmeyecekse veri elemanlar dorudan public

    blgeye de yerletirilebilir. Bu durumda onlar dorudan kullanmann birzarar olmaz.

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

    /*----date3.cpp----*/Dinamik Tahsisat Yapan Snflar

    Pek ok snf balang fonksiyonu ierisinde bir veri eleman iin dinamik tahsisat yapar.Tahsis edilen bu dinamik blgenin biti fonksiyonu ierisinde otomatik olarak sisteme iadeedilmesi istenir.

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

    Bir dosyann balang fonksiyonu iinde almas ve biti fonksiyonunda otomatik olarakkapatlmas gibi durumlara ska rastlanr.

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

    Bazen biti fonksiyonunda otomatik olarak yaplan geri alma ilemi bir ye fonksiyon ilebilinli olarak da yaplabilir. Bylece biti fonksiyonundaki geri alma ilemi geersiz hale gelir.nk geri alma ilemi daha nce geeklemitir. O halde biti fonksiyonu ierisinde geri almailemi daha nce yaplmsa geri alma ilemini yapmamak gerekir. bunu salamak iin eitliveri elamanlarndan faydalanlabilir.

    File::File(void)

    { f = NULL;

    }

    File::~File(void)

    {

    if (f)

    fclose(f);

    }

    Snf Trnden Gstericiler ve Adresler

  • 8/14/2019 Tmyle CPP

    30/94

    30

    Bir snf nesnesinin veri elamanlar tpk bir yap gibi bellee adrl bir biimde yerletirilir.Snfn ayn blmndeki veri elemanlar o blm ierisinde ilk yazlan dk anlaml adresteolacak biimde ardl olarak yerletirilirler. Ancak blmlerin sras iin herhangi birzorunluluk standartlara konulmamtr. Yani blm ileri ilk yazlan dk anlaml adresteolacak biimde yerletirilir, ancak blmlerin kendi aralarnda nasl yerletirilecei

    derleyiciden derleyiciye deiebilir. Blmler aras yerleim de ardl olmak zorundadr.Ancak derleyicilerin hemen hepsi blm fark gzetmeksizin ilk yazlan elemann dkanlaml adreste olaca biimde yerleim kullanrlar. Bir snf nesnesinin adresi alnabilir. Eldeedilen adresin saysal bileeni snf veri eleman blounun balang adresidir. Bir snf trndendeikenin adresi ayn trden bir snf gstericiye yerletirilmelidir. Bir snf gstericisi yoluylasnfa ilikin bir ye fonksiyon ok 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 operatryle arldnda yefonksiyon o gstericiyel belirtilen adreste bulunan veri elemanlarn kullanr.

    p -> Disp(); Disp() ye fonksiyonu p gstericisinin ierisinde bulunan veri elemanlarnkullanr.

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

    Yine gsterici yoluyla snfn veri elemanlarna eriilir. Tabii bu elemanlarn public blgedeolmas gerekir.

    Snf Trnden Referanslar

    Bir snf trnden referans ayn trden bir snf nesnesiyle ilk deer verilerek tanmlanabilir. Budurumda derleyici ilk deer olarak verilen snf nesnesinin adresini referansa yerletirir. Birreferans yoluyla snfn veri elemanlarna ve ye fonksiyonlaryla nokta operatr kullanlarakeriilir. Bir referans ile bir ye fonksiyonu arldnda ye fonksiyon referansn ierisinde

    bulunan adresteki veri elemanlarn kullanr./*-----date5.cpp-----*/

    Snf Trnden Deikenlerin Fonksiyonlara Geirilmesi

    Bir snf tpk yap gibi bileik bir nesnedir. Bu durumda yaplarda olduu gibi fonksiyonageirmede iki teknik kullanlabilir. Snfn kendisinin geirilmesi yntemi zel durumlardnda kt bir tekniktir. Adres yntemiyle fonksiyona geirme teknii tercih edilmelidir.Adresle geirme ilemi C++ta iki biimdeyaplabilir:1. Gsterici kullanlarak: Yani fonksiyon bir snf nesnesinin adresiyle arlr. Fonksiyonun

    parametre deikeni de ayn snf trnden bir gsterici olur. Bu durumda fonksiyonierisinde snfn veri elemanlarna ve ye fonksiyonlarna ok operatryle eriilir.

  • 8/14/2019 Tmyle CPP

    31/94

    31

    /*-----date6.cpp-----*/

    2. Referans kullanlarak: Bu durumda fonksiyon bir snf nesnesinin kendisiyle arlr.Fonksiyonun parametre deikeni ayn trden bir referans olur. Fonksiyon ierisinde verielemanlarna ve ye fonksiyonlarna 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 yerdeki veri elemanlarn kullanr. Bir snftrnden referans ya da gsterici tamnmlandnda balang fonksiyonu arlmaz. nk

    balang fonksiyonu nesnenin kendisi tanmlandnda arlmaktadr.

    Snf Trnden Dinamik Alan Tahsis Edilmesi

    New operatryle bir snf trnden heap zerinde dinamik bir alan tahsis edilebilir. Tahsisedilen alann balang adresi ayn trden bir gstericiye atanmaldr. Madem ki newoperatryle heap zerinde bir nesne yaratlyor o halde yaratlan nesne iin balangfonksiyonu arlr. Bir snf trnden dinamik alan tahsis edildiinde tahsis edilme ilemininhemen ardndan derleyici tarafndan otomatik olarak tahsis edilen alan iin balangfonksiyonu arlr. Eer snf isminden sonra bir parantez almazsa varsaylan balangfonksiyonu, alr ve bir parametre listesi yazlrsa parametre listesine uygun olan balangfonksiyonu 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 ve delete ileyaplmasnn nedeni balang fonksiyonunun otomatik olarak arlmasn salamak iindir.

    Snf Trnden Yaratlm Dinamik Bir Alann Boaltlmas

    Dinamik olarak tahsis edilmi bir snf delete operatryle sisteme iade edilebilir. deleteoperatr alan serbets brakmadan nce biti fonksiyonunu otomatik olarak armaktadr.

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

    new operatryle bir snf trnden bir dizi alan tahsis edilebilir.

    p = new X[n];

  • 8/14/2019 Tmyle CPP

    32/94

    32

    Bu durumda derleyici n * sizeof(X) kadar alan dinamik olarak tahsis eder ve yaratlm olan nnesnenin her biri iin default balang fonksiyonunu arr. Bir dizi iin alan tahsis edilmesidurumunda tahsis edilen snf nesneleri 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 nadir rastlanr. Bir dizi snfnesnesi iin tahsis edilmi olan alann delete ile silinmesi durumunda her bir snf nesnesi iinayr ayr biti fonksiyonu arlr. Ble bir durumda eer yanllkla silme ilemi keli

    parantez kullanlmadan yaplrsa(rnein: delete p;) tm dinamik alan serbest braklr fakatyalnzca ilk yaratlm nesne iin biti fonksiyonu arlr.

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

    Snf Trnden Dinamik Tahsisat lemininAnlam ve nemi

    class X{

    public:

    X(int n);

    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 arlaca nokta, nesnenintanmland yere gre belirlenmektedir. rnein yerel bir nesne iin biti fonksiyonu

  • 8/14/2019 Tmyle CPP

    33/94

    33

    kesinlikle tanmlama blonun sonunda arlr. Oysa tahsisat ilemi dinamik olarak yaplrsa ,nesnenin yaratlmas ve bellekten silinmesi, balang ve biti fonksiyonlarnn arlmas

    programcnn istedii noktada yaplabilir.Dinamik olarak tahsis edilmi snf nesnesi iin delete operatr ile silme yaplmamsa tahsisedilmi olan alan normal olarak programn bitiminde sisteme iade edilir. Ancak bu iade edilme

    ilemi srasnda biti fonksiyonu arlmaz. Dinamik olarak tahsis edilmi bir alan iin bitifonksiyonunun arlmas ancak delete ilemi ile mmkn olabilir.

    Snf nesnesi iin dinamik tahsisat yapld halde balang fonksiyonun arlmamasaadaki gibi salanabilir.

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

    CONST ye fonksiyonlar

    Standart Cde bir fonksiyonun const olmas tanml ve geerli deildir. Oysa C++ds bir snfnye fonksiyonu const olabilir. (C++da global bir fonksiyon const olamaz, sadece snf yefonksiyonlar const olabilir)

    Bir ye fonksiyonu const yapabilmek iin, fonksiyon prototipinde ve tanmlama srasndaparametre parantezi kapatldktan sonra const anahtar szc yazlmaldr. (Not const anahtarszcnn 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){

  • 8/14/2019 Tmyle CPP

    34/94

    34

    printf(I am a destructor\n);}

    void main(void)

    {

    X a(20); //hata vereceka.disp();

    }

    Const ye fonksiyonlar, const ye fonksiyonlarda olduu gibi okunabilirlii artrmak iinkullanlabilir.

    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::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 vereceka.disp();

  • 8/14/2019 Tmyle CPP

    35/94

    35

    a.set(50);

    a.disp();

    }

    Const bir fonksiyon ierisinde const olmayan bir fonksiyonarlamaz, nk const olmayan

    bir fonksiyon snfn veri elemanlarn kullanabilir.

    Const bir ye fonksiyonun ierisinde snfn btn ye elemanlarnn const olduu kabul edilir.rnein byle bir ye fonksiyon ierisinde snfn bir veri elemannn adresi const olmayan birgstericiye atanamaz.

    Not: C++da const bir deikenin adresi const olmayan bir gstericiye atanamaz.

    Snfn balang ve biti fonksiyonlar const ye fonksiyonu olarak tanmlanamaz. Yasak.

    Const Snf Nesneleri

    void main(void)

    {

    const X a(10);

    }

    Bir snf nesnesi const olabilir. Bu durumda snf nesnesinin veri elemanlar her hangi birbiimde deitirilemez. Const bir snf nesnesi ile ancak const bir 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 bu gsterici ya da referanslaancak const ye fonksiyonlar arlabilir. zellikle bir fonksiyonun parametre deikenininconst bir snf gstericisi ya da const bir snf referans olma durumuna sklkla rastlanr.

    String Snf

    Cde yazlar zerinde ilem yapmak iin karakter dizileri kullanlr. Ancak karakter dizilerininnormal bir dizi biiminde tanmlanmas genellikle kullanlan yntem olsa da nemli

    problemleri vardr. rnein dizinin uzunluu sabit ifadesi olmak zorundadr. Bylece yazlarn

    bytlmesi gibi ilemler 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 bakmndan etkinlik problemi giderilebilir.Ancak ilemsel karmaklk artar, kod bymesi oluur. Ancak C++ta yaz ilemleri iin zeltasarlanm string snflar kullanlabilir. Bu snflar yazlar dinamik olarak saklarlar. Dinamik

    bellek ilemleri ye fonksiyonlar tarafndan otmatik olarak yapld iin alglsal dzeydekarmaklk olumaz. Bir snf kullanlarak yazlar zerinde ilemler yapmak iin MFC snfsisteminde Cstring isimli bir snf tasarlanmtr. Yine son yllarda ANSI C++ ierisine dahiledilen standart bir string snf vardr. Standardizasyon konusundan problemleri olmasnakarn yaz ilemlerini yapan bir string snf her trl derleyici sisteminde ve snfktphanelerinde kullanlmak zere hazr bulundurulmaktadr. Byle bir snfn tasarm iin

    C++n pek ok konusundan faydalanlmaktadr. Kurs ierisinde eitli konular grlrken busnf tekrar tekrar grlecektir.

  • 8/14/2019 Tmyle CPP

    36/94

    36

    String Snfn Tasarm

    String snfn en az iki private veri eleman olmaldr. Birincisi yaznn balang adresini tutankarakter trnden bir adrestir. Yaz iin alan dinamik olarak tahsis edilerek balang adresi bu

    gstericiye yerletirilecektir. kinci veri eleman yaznn uzunluunu tutan int trnden birdeiken olabilir. Tabii aslnda yaznn sadece balang adresinin bilinmesi uzunluununistenildii zaman bulunabilecei anlamna gelmektedir. Ancak yaz uzunluuna duyulangereksinimin fazlal ve hzn yer kaplamaya gre tercih edilmesi byle bir veri elemannn

    bulunmasn anlaml hale getirmektedir. Byle bir snftan ilk istenecek ey dinamik yaplantahsisatlarn ye fonksiyonlar tarafndan gizlice gerekletirilmesidir. Snfn balangfonksiyonu new operatryle tahsisat yapabilir ve biti fonksiyonu bu tahsisat serbest

    brakabilir.

    Bir Snfn Baka Bir Snf Trnden Veri Elemanna Sahip Olmas Durumu

    Bir snf baka bir snf trnden veri elemanna sahipse o snfn ye fonksiyonlar ierisindeeleman olan snf nesnesine eriilebilir. Ancak o snf nesnesinin private ve protected

    blmlerine eriilemez. Snfn balang fonksiyonu bir ye fonksiyonuymu gibi dardanarlamaz, nesne yaratlrken otomatik olarak arlr. O halde bir snfn baka snftrnden veri elemanna sahip olmas durumunda bu veri elemanna balang fonksiyonuierisine nasl ilk deer atanacaktr? Bunu salamak iin C++ta eleman olan snfn balangfonksiyonu eleman nesne iin elemana sahip snfn balang fonksiyonunun ana blounun

    banda gizlice arlr. Eer : syntaxi ile bir belirleme yaplmamsa eleman olan snfndefault balang fonksiyonu arlr. Eer : ile veri elemannn ismi yazlp parantezierisine bir parametre listesi belirtilmise, eleman b parametre listesine uygun balangfonksiyonu ile ilk dee alr. X bir snf a ise baka bir snf trnden X snfnn bir veri elemanise bu veri eleman iin istenilen bir balang fonksiyonunun arlmas aadaki syntax ileyaplr.

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

    {

    ...

    }

    Bir parametre deikeninin faaliyet alan tanmlanma noktasndan fonksiyonun sonuna kadarolan 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;

  • 8/14/2019 Tmyle CPP

    37/94

    37

    };

    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);

    }

    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;}

  • 8/14/2019 Tmyle CPP

    38/94

    38

    void main(void)

    {

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

    X.Disp();}

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

    Balang fonksiyonlarnn arlma sralar nce elemana ilikin snfn balang fonksiyonusonra elemana sahip snfn balang fonksiyonu biimindedir. C++ta her zaman balang ve

    biti fonksiyonlarnn arlma sras terstir. Bu durumda elemana ilikin snfn bitifonksiyonu elemana sahip biti fonksiyon blounun sonunda otomatik olarak arlr. Yanielemana sahip snfn biti fonksiyonu daha nce arlmaktadr.

    Bir snfn baka snf trnden birden fazla veri eleman varsa bu veri elemanlar iin balang

    fonksiyonlar arlma sras snf bildiriminde ilk yazlan nce olacak biimde yaplr. :syntaxi ile belirtilen sra neli deildir.

    class Y {

    .........

    ........

    };

    class X {

    .........

    .........

    Y a, b;

    };

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

    {

    ........

    ........

    }

    /*nce ann parametreleriyle belirtilen *//*Y snfnn balang fonksiyonu arlr. */

    Biti fonksiyonlarnn arlma sras balang fonksiyonuna gre ters srada olmakzorundadr. Yani rnekte nce b iin biti fonksiyonu alr.

    Bir Snfn baka Bir Snf Trnden Gsterici Veri Elamanna Sahip Olmas Durumu

    Bu duruma dier durumdan daha sklkla rastlanmaktadr. Tabii gsterici veri eleman iinbalang fonksiyonu arlmaz. Ancak elemana sahip snfn balang fonksiyonu ierisindebu gsterici iin dinamik tahsisat yaplmaldr. Elemana sahip biti fonksiyonu ierisinde dedelete operatryle balang fonksiyonunda tahsis edilen alan serbest braklmaldr. Buserbest brakma ile biti fonksiyonu da kendiliinden arlacaktr.

    /*-----claincl2.cpp-----*/

  • 8/14/2019 Tmyle CPP

    39/94

    39

    #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);

    }

    Date::~Date(void)

    {

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

    }

  • 8/14/2019 Tmyle CPP

    40/94

    40

    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 szcgetirilebilir. rnein:

    inline void fonk(void)

    {

    ....

    }

    (inline anahtar szc prototipte deil tanmlama srasnda kullanlmaldr.)

    Bir inline fonksiyon tpk bir makro gibi ilem grr. Yani inline fonksiyon arldndafonksiyon arma kodu yerine fonksiyon kodunun kendisi yerletirilir.

    /*-----inline.cpp-----*/

    #include

    inline double square(double x)

    {

    return x * x;

    }

  • 8/14/2019 Tmyle CPP

    41/94

    41

    void main(void)

    {

    double n;

    n = square(3);

    printf("%lf\n", n);

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

    Inline ile yaplmak istenen makro ile yaplmak istenenle ayndr. Makro n ilemci tarafndanalrken inline fonksiyonlar derleme modl tarafndan almak. inline fonksiyonlar ilemakrolar ayn amalar iin kullanlmalarna karn inline fonksiyonlar makrolara gre ok dahakullanl ve salamdr. rnein: Makrolar ++ ve operatrleriyle arlamad halde(phelikod oluabilir), inline fonksiyonlar gvenli bir biimde arlabilir. nk inlinefonksiyonlarda nce parametre ifadesi deerlendirilir, sonra ama ilemi gerekletirilir. Tabiiinline fonksiyonlar normal bir fonksiyon gibi yazlp arlrlar. Operatrlerin nceliindenoluacak problemler derleyici tarafndan zaten giderilirler. inline fonksiyon parametrelerini

    parantez ierisine almaya gerek yoktur. inline fonksiyonlar dier fonksiyonlarda olduu gibi trdntrmesi ve tr bakmndan derleyicinin denetiminden geerler. Yani inlinefonksiyonlarda errorler ortaya kabilir, bylece kod almadan hatalar tespit edilir. Yani dahasalamdr. Bu nedenlerden dolay C++ta neredeyse makro hi kulanlmaz. Hep inlinefonksiyonlar kullanlr.

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

    EdeeriX::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 drtgensel blgeler zerinde temelileri yapmay hedefleyen bir snftr. Snfn drtgensel blgeni sol st ve sa alt kegenini

    belirleyen 4 veri eleman vardr./*-----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);

  • 8/14/2019 Tmyle CPP

    42/94

    42

    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

    { 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){

  • 8/14/2019 Tmyle CPP

    43/94

    43

    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 snf nesnesinin adresigizlice ye fonksiyona geirilir. ye fonksiyon ierisinde snfn veri elemanlarna erime bugizlice geirilmi olan gsterici yluyla yaplr. Yani bir ye fonksiyonunun hi parametresiyoksa aslnda gizli bir parametresi vardr. Bu da arlan snf nesnesinin adresini tutangstericidir. Snfn ye fonksiyonlarnn, snfn veri elemanlarna erimesi aslnda adresyoluyla yaplmaktadr. Tabii kolaylk olmas bakmndan geirilen bu gizli gsterici aka

    parametre listesinde grnmez. Eriim srasnda ok operatr de kullanlmaz.

    C++ta ye fonksiyonunu arlmas Cdeki karlvoid 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};

    Crect_Disp(&x);

    }

    ye fonksiyona gizlice geirilen bu adres ye fonksiyon ierisinde aka this anahtarszcyle kullanlabilir. this parametre biiminde programc tarafndan yazlamaz, ancakyazlm gibi kullanlabilir. x bir snfn veri eleman olmak zere ye fonksiyon ierisinde x ilethis -> x tamamen ayn anlamdadr. Bir ye fonksiyon baka bir ye fonksiyonu aryorsaaran ye fonksiyona ilikin this gstericisi dorudan arlan fonksiyona geirilir. thisgstericisi global fonksiyonlarda kullanlmaz, sadece herhangi bir snfn ye fonksiyonuierisinde kullanlabilir. this gstericisi hangi snfn ye fonksiyonunda kullanlrsa tr de osnf trnden gsterici olur. this gsterisinin deeri deitirilemez. this gstericisi kendisiconst olan const bir gsterici biimindedir.

    /*-----this.cpp-----*/#include

  • 8/14/2019 Tmyle CPP

    44/94

  • 8/14/2019 Tmyle CPP

    45/94

    45

    void main(void)

    {

    X n;

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

    }

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

    Bunun gibi snf bildirimi iinde tanmlanan fonksiyonlar otomatik olarak inline fonksiyonolarak kabul edilir. Snf ierisinde tanmlanm fonksiyonlarn srasnn hibir nemi yoktur.Yani yukardaki fonksiyon aadaki fonksiyonu arabilir. inline bildirimi (darda ya dagizlice snf iinde) bir zorunluluk biiminde deil bir istek biimindedir. Yani derleyici birinline fonksiyonu inline olarak aamayabilir. Eer aamazsa onu normal bir fonksiyon gibi elealr. Aamadndan dolay herhangi bir error 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 istendiinde bavurulacak en iyi yntemtretme ilemidir. Bir snfa ek yapmak snfa yeni veri ve ye fonksiyonu eklemekanlamndadr. Bir snfa ek yapmak iin tretme dnda birka yntem akla gelebilir:

    1. Snfa dorudanekleme yapmak

    Bu durumda nceki snfn bir kopyas kartlr ve zerindeeklemeler yaplrsa, gereksiz bir biimde ye fonksiyon tekraryaplr.

    2. nceki snf bir verieleman olarak kullananyeni bir snf tanmlamak

    class A {

    //...

    };

    class B {

    A a;

    //...

    };

    Bu durumda veri eleman public blgeye yerletirilirsegeniletilecek snfn ye fonksiyonlar bu nesne sayesinde arlr.

    Ancak bu yntem de tretme yntemine gre eitli kstlamalarolan bir yntemdir.

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

    Tretme ileminin genel biimi:

    class :[private/protected/public] {

    Tretme biimi

  • 8/14/2019 Tmyle CPP

    46/94

    46

    }

    rnek:

    class A {

    int a;//...

    };

    class B:public A {

    int b;

    //...

    };

    ki nokta stste ayracndan sonra istee bal olarak tretme biimi yazlabilir. Yazlmazsaprivate yazlm gibi ilem grr.

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

    /*-----turetme.cpp-----*/

    #include

    class A {

    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 kendi veri elemanlarblok olarak ardl bir biimde yerletirilir. Ancak taban snf ve tremi snf veri elemanlarnnhangisinin daha dk adres blgesine yerletirilecei ANSI standartlarnda belirlenmemitir,

    dolaysyla derleyiciyi yazanlara braklmtr.

  • 8/14/2019 Tmyle CPP

    47/94

    47

    A B

    B A

    Tabii derleyici organizasyonu hep ayn yapar. Yaygn kullanlan derleyicilerde taban snf verielemanlar dk anlaml adresi yerletirilmektedir(Kursta btn rneklerde nce taban sn f

    veri elemanlar 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 public blmym gibi, tabansnfn protected blm de tremi snfn protected blmym gibi ilem grr. Tabansnfn private blm eriime kapaldr. Taban snfn private blmne tremi snf

    tarafndan eriilemez.

    Taban Tremiprivate

    protected protected

    public public

    Public Tretmesinden kan Sonular

    1. Tremi snf nesnesi yoluyla dardan nokta ya da ok operatr kullanlarak taban snfnpublic blmne eriilebilir. Ancak taban snfn protected ve private blmne eriilemez.

    2. Tremi snf ye fonkiyonlar ierisinde taban snfn public ve protected blmlerinedorudan eriilebilir.ancak taban snfn private blmne eriilemez.

    Protected Tretmesi

    Bu tretme biiminde taban snfn public ve protected blmleri tremi snfn protectedblmym gibi ilem grr. Taban snfn private blm eriime kapaldr. Tremi snftarafndan eriilemez.

    Taban Tremi

    privateprotected protected

    public

    Protected Tretmesinden kan Sonular

    1. Tremi snf nesnesiyle dardan nokta ya da ok operatryle taban snfn hibirblmne eriilemez.

    2. Tremi snf ye fonksiyonlar ierisinde taban snfn public ve protected blmlerinedorudan eriilebilir. Ancak private blmlerine eriilemez.

    Private Tretmesi

  • 8/14/2019 Tmyle CPP

    48/94

    48

    Bu durumda taban snfn public ve protected blmleri tremi snfn private blmymgibi ilem grr. Taban snfn private blm eriime kapaldr. Tremi snf tarafndaneriilemez.

    Taban Tremi

    privateprotected private

    public

    Private Tretmesinden kan Sonular

    1. Tremi snf nesnesi yoluyla dardan nokta ya da ok operatryle taban snfn hibirblmne eriilemez.

    2. Tremi snf ye fonksiyonlar ierisinde taban snfn public ve protected blmlerinedorudan eriilebilir. Ancak private blmlerine eriilemez.

    Tretme leminden kan Ortak Sonular

    1. Tremi snf nesnesi yoluyla dardan nokta veya ok operatr kullanlarak ancak tabansnfn public blmne ancak public tretmesiyle eriilebilir. Hibir zaman dardan tabansnfn protected ya da private blmne eriilemez.

    2. Tremi snf ye fonksiyonlar ierisinde tretme biimi ne olursa olsun taban snfnpublic ve protected blmlerine eriilebilir.

    3. Taban snfn private blm tam olarak korunmutur. Tremi snf tarafndan dorudanhibir ekilde eriilemez.

    En ok kullanlan tretme biimi public tretmesidir.

    Protected Blmnn Anlam

    Protected blm dardan dorudan eriilemeyen, ancak tremi snf ye fonksiyonlartarafndan eriilebilen bir blmdr. Protected blmnn tretme dnda zel bir anlamyoktur. nk bu blm tremi snfn eitli ilemlerini kolaylatrmak iin gereksinimlerinitutmakta kullanlr.

    Private Blme Fonksiyonlar Yerletirilmesi

    Bir snfn public blmnde bulunan X() isimli fonksiyon ilemini gerekletirmek iinilemin belirli blmlerini yapan, yani ara ilemleri yapan eitli fonksiyonlar kullanabilir. Buara ilemleri yapan fonksiyonlarn dardan arlmasnn hibir anlam yoktur. Algdan uzaktutmak amacyla private blme yerletirilebilirler. Snf kullanacak kii iin private blgeninincelenmesi gereksizdir.

    Somut, Soyut ve Arabirim Snflar

    Kendisinden baka bir snf tretilmeyecek biimde tasarlanan snflara somut snflar(concreate cleass) denir. Somut snflar belirli bir konuda yararl ilemleri yaparlar. Genellikleilevlerinin geniletilmesi biiminde bir istek sz konusu olmaz.

  • 8/14/2019 Tmyle CPP

    49/94

    49

    Soyut snflar (abstract class) kendi bana bir anlam olmayan kendisinden tretme yaplarakkullanlmas zorunlu olan snflardr. C++ta soyut snflar derleyici tarafndan belirli bir syntaxiimiyle dorudan desteklenirler.

    Arabirim snflar (interface class) en ok rastlanan snflardr. Kendi balarna yararl ilemeleri

    yapabilen, ancak tretme ilemine de izin verebilecek biimde tasarlanm snflardr. Arabirimsnflar tasarlayan kii bunlar tretme durumunu gz nne alarak tasarlamaldr.

    Tretme lemine Birka rnek

    - Seri port ilemleriniyapan serial isimli bir snf olsun. Bu snfn ye fonksiyonlar portu setetme, okuma ve yazma gibi temel ilemleri yapsn.Modem seri porta balanarak kullanlan, ve iletiimi salayan bir aratr. Modemi

    programlamak iin seri porta bilgi gndermek gerekir. Modem ilemlerini yapmak iinserial snfndan tretme uygulanabilir. Benzer biimde laplink kablosu kullanarak seri

    portlar aras bilgi transferi iin laplink isimli ayr bir snf tretilebilir.

    - MFC snf sisteminde CWnd snf genel olarak her trl pencereyle ilgili ilem yapmakamacyla kullanlr. Dialog pencereleri zel pencerelerdir. Yani bir pencerenin tmzelliini gsterir, ancak ek zelliklere de sahiptir. CDialog snf CWnd snfndantretilmitir.

    Ancak her dialog penceresi kendine zg farkllklara sahiptir. MFCde ne zaman bir dialogpenceresi alacak olsa CDialog snfndan bir snf tretilmeli ve dialog penceresi o snflailikilendirilmelidir.

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

    yaplacaktr.

    CWnd

    CDialog

    public

    CWnd

    CDialog

    MyDialog

    public

    public

  • 8/14/2019 Tmyle CPP

    50/94

    50

    Tremi Snflarda Faaliyet Alan

    Snf faaliyet alan bir snfn ve ondan tremi olan snflarn ye fonksiyonlar arasndatannabilme araldr. Bir veri eleman ya da ye fonksiyonu ayn isimle taban ve tremisnflarda tanml olabilir. Bu durumda:

    1. Tremi snf ye fonksiyonu ierisinde ilgili isim dorudan kullanlrsa dar faaliyetalannasahip olan yani tremi snfta tanlanm olan anlalr. Eer istenirse znrlkoperatryle snf ismi belirtilerek (X::a = 10) taban snftaki isme eriilebilir.

    2. Tremi snf nesnesi yoluyla dardan nokta ya da ok operatryle ayn isimli deikeneya da fonksiyona eriildiinde yine dar faaliyet alanna sahip olan tremi snftaki isimanlalr. Ancak nokta ya da ok operatrnden sonra yine znrlk operatrkullanlabilir (p->X::a).

    3. Taban ve tremi snf ierisinde ayn isimli fakat farkl parametre yaplarna sahipfonksiyonlar olsun. Eer tremi snfn baka birt ye fonksiyonunda ayn isimli fonksiyonarlmsa bu fonksiyon yalnzca dar faaliyet alannda aranr. Yani parametre yaplarfarkl bile olsa dar faaliyet alanndaki dierini gizlemektedir. Ayn durum dardan tremi

    snf nesnesi yoluyla nokta ya da ok operatryle de sz konusu olur. Yani dar faaliyetalanndaki isim geni faaliyet alann gizleyerek bu ismin orada aranmamasnsalar(Global fonksiyon arrken :: operatr fonksiyon isminin nne getirilir). Birsnfn ye fonksiyonu ierisinde 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 znrlk operatrylearlmsa 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 yalnzca global faaliyetalannda aranr. Bir snfn ye fonksiyonu ierisinde snfn ve taban snflarn globalfonksiyonla ayn isimli fonksiyonlar olmasa bile arma ilemi okunabilirlik bakmndanyine unary znrlk operatr kullanlarak yaplmaldr. Fonksiyonlar iin belirtilen buarama durumlarnn hepsi normal deikenler iinde geerlidir.

    Tremi Snfn Taban Snf armas lemleri

    Normal olarak tremi snf taban snfa eriebilir. Yani tremi snf nesnesiyle ya da tremisnf ye fonksiyonlar ierisinde taban snf nesnesi ya da fonksiyonlar kullanlabilir. ancaktersi durum mmkn deildir. Yani taban snf tremi snfa eriemez. Taban snf derlenirkenderleyici bundan bir snf tretileceini bilmek zorunda deildir. Bu durumda tremi snfnesnesi ile taban snf ye fonksiyonu arldnda derleyici bu fonksiyona this gstericisiolarak tremi snf nesnesinin taban ksmnn adrsini geirir. Uygulamada taban snf verielemanlar daha dk adrese yerletirildiinden geirilen adres nesnenin btnsel balangadresiyle ayn olur.

    B x;x.fonka();

    A

    B

    1FC0

    1FC2

  • 8/14/2019 Tmyle CPP

    51/94

    51

    Burada A taban snfnn fonka ye fonksiyonuna this gstericisiyle 1FC0 adresigeirilmektedir. Tremi snf nesnesiyle tremi snfn ye fonksiyonu arldnda yinetaban snf veri elemanlarnn bulunduu toplam veri adresi geirilir. nk tremi snf yefonksiyonu ierisinde taban snf ye fonksiyonu arldnda derleyici taban snf veri

    blounun adresini tespit edebilmek zorundadr.

    Bir Dizi Tretme Yaplmas Durumu

    Tretme ilemi birden fazla yaplabilir Bu durumda yukardaki snflar ayn kurallarlaaadan eriilebilir. Bir snfn bir dizi tretme yapldnda bir steki taban snfna dorudantan snf (direct base class) sonraki taban snflarna ise dolayl taban snf (indirect base class)denir. Bir snf birden fazla snofa taban snf olabilir. Bu durum atmaya yol amayacak

    biimde ak ve anlalr bir tretme durumudur.

    Ancak bir snffn birden fazla taban snfa sahip olmas ayr bir blmde incelenecek kadarkarmak bir konudur. Bu duruma oklu tretme denir. oklu tretme dier bilgisayardillerinde desteklenmemektedir.

    Taban Snf Trnden Gstericilere Tremi Snf Nesnelerinin Adreslerinin Atanmas

    C++'ta bir gstericiye farkl trden bir gstericinin atanmas uyar deil error gerektirir. Ancakistisna olarak taban snf trnden bir gstericiye tremi snf trnden bir nesnen in adresiatanabilir. Ancak bunun tersi olan durum, yani tremi snf trnden bir gstericiye taban snftrnden bir nesnenin adresinin atanmas durumu yararl ve geerli bir ilem deildir.

    class A {

    ..

    ..

    A B

    C

    A

    B C

  • 8/14/2019 Tmyle CPP

    52/94

    52

    };

    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 tremi snf nesnesininadresi taban snf gstericisine geirildiinde problemli ya da gvensiz bir durum olumaz.Derleyici bu durumda tremi snf nesnesinin taban snf veri elemalarnn adresini gstericiyeatar. Taban snf gstericisiyle ancak taban snf ye fonksiyonlar arlabileceine gre bugstericiyle tahsis edilmi bir alana eriilir, yani uygunsuz bir durum olumaz. Mademki tabansnf ve tremi snf veri elemanlarnn yerleimi kesin birstandartla belirlenmemitir, byle

    bir atamada derleyici tremi snf nesnesinin taban snf elemanlarnn balang adresini tespitedip o adresi atamaldr. Tabii genellikle taban snf veri elemanlar dk anlaml adreseyerletirildiinden geirilenadres de nesnenin btnnn balang 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;

    }

    };

    class B : public A {

    int b;

    public:

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

  • 8/14/2019 Tmyle CPP

    53/94

    53

    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 Gstericisine Atanmas lemininProgram erisinde Karlalabilen eitli Durumlar

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

    1. Ak bir biimde yaplan atamalarla:

    Yani taban snf trnden bir gsterici tanmlanr, tremi snf trnden bir nesnenin adresiatanr.

  • 8/14/2019 Tmyle CPP

    54/94

    54

    {

    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. Fonksiyontremi snf nesnesinin adresiyle arlr. Bu biimde atama ilemi en sk rastlanan atamailemidir.

    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 ilk deer verilerektanmlanabilir. Derleyici bu durumda tremi snf nesnesinin taban snf veri eleman bloununadresini taban snf referansna 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. Fonksiyonda tremi snf nesnesinin kendisiyle arlr.

    void fonk(A &p)

    {

    p.DispA();

    }

    v