Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

yapıcı fonksiyonlar

Konu, 'C / C++' kısmında digrev tarafından paylaşıldı.

  1. digrev

    digrev Üye

    Kayıt:
    7 Şubat 2012
    Mesajlar:
    149
    Beğenilen Mesajlar:
    0
    arkadaşlar yapıcı fonnksiyonlar la ilgili kafama takılan şey şu bildiğim kadarılyla ilk değer atamak için oluşturuluyorlar aşağıdaki örnekteki gibi ama neden yapıcı fonksiyonara ihtiyacımız alltaki gibi bir ata adındaki fonksiyonda aynı şeyi yapmazmı onu sorucaktım farkı ne

    Kod:
    #include <cstdlib>
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    
    
     class deneme {
           
           int a;
           public:
                deneme(int x){
                           
                           a=x;
                           }
                        void   goster(){
                                    cout<<a;
                                    }
                       
           };
    int main (){
     deneme d(4);
     d.goster();
        system("pause");
    return 0;
    
        }
    
    Kod:
    
    
    
    
    #include <cstdlib>
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    
    
     class deneme {
           
           int a;
           public:
                 int  ata (int x){
                         a=x;
                         return a;
                         }
                       
           }d;
    int main (){
      cout<<  d.ata(3);
        system("pause");
    return 0;
    
        }
    
     
    Son düzenleme yönetici tarafından yapıldı: 18 Haziran 2012
  2. Maradona

    Maradona Daimi Üye

    Kayıt:
    20 Kasım 2011
    Mesajlar:
    663
    Beğenilen Mesajlar:
    1
    Basit veri tipleri icin -senin kullandigin int gibi- cok fark olmayabilir ama nesne üretmek istedigin sinif diger siniftan bir nesneye bagliysa ve o nesne olmadan calisamiyorsa senin nesneni üretmenin bir anlami yoktur. Ata metodunu nesne ürettikten sonra her zaman cagirmak gerekebilir. Unutursan ve program istedigin gibi calismazsa öncelikle hata araman gerekir. Yapici fonksiyon parametre aliyorsa nesne üretirken bir deger vermek zorunda oldugunu görürsün.
     
  3. Furkan Onka Uğur

    Furkan Onka Uğur Moderatör Yetkili Kişi

    Kayıt:
    12 Eylül 2008
    Mesajlar:
    3,713
    Beğenilen Mesajlar:
    48
    Şehir:
    Ankara
    Bazen nesnelerimizin doğar doğmaz bazı özelliklere sahip olmasını isteriz:) En basit nedeni bu. Maradona ise kalıtımdan bahsetmiş. Orada da gerekli.

    Aslında bu gibi farklar bizim hangi kodu hangi araçla yazdığımıza da bağlıdır diyebiliriz. Örneğin VB6'da parametre alan herhangi bir kurucu metod tanımı yoktur. VB6'da her nesne oluşturulacağı zaman varsayılan değerine ilklenmektedir. Bu gibi durumlarda INIT adı verilen ayrı bir metodu daha sınıfımıza ekleriz. Benzer bir olay (yanlış hatırlamıyorsam) Objective C'de de mevcut: http://www.otierney.net/objective-c.html
     
  4. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    Ben de iki noktanın altını çizmek istiyorum:

    1) Çöp değerleri önlemek: ata() gibi bir yöntem kullanıldığı zaman, üyelerine değerleri ata() çağrılana kadar belirsizdir ("çöp değer"). Aynı nedenden, aslında gösterdiğin kurucu da iyi kabul edilmez çünkü kurucu işlevin içine girildiğinde de 'a'ya atanana kadar değeri çöptür. (Tabii bunun sakıncası tek üye olduğunda görülmeyebiliyor.) O yüzden doğrusu, bütün üyeleri önce ilk değer listesinde ilklemektir.

    Kod:
    class deneme
    {
    // ...
        deneme(int x)
            :
            a(x)    // <-- Burada ilklenir
        {
            // <-- a'nin degeri cop degildir
        }
    }
    2) Mutlak değişmezleri (invariant) korumak: Nesnelerin mutlak değişmezleri vardır. Örneğin, vector gibi bir topluluğun eleman adedini sakladığı üye değişkeninin gerçekten de içindeki eleman adedine eşit olması şarttır. O yüzden nesneler ata() (veya set(), vs.) gibi işlevlerle dışarıdan değil, kurucuları içinde kendileri tarafından ilklenirler. Zaten NYP'nin çıkış amaçlarından birisi de mutlak değişmezlerini korumaktır.

    Ali
     
  5. digrev

    digrev Üye

    Kayıt:
    7 Şubat 2012
    Mesajlar:
    149
    Beğenilen Mesajlar:
    0
    beyler hepinize teşekkür ederim anladığım kadarıyla ben daha yeni başladığım ve küçük çapta uğraştığım için yapıcı fonksiyonu gerektiği gibi kullanma fırsatı bulamadım özellikle kalıtımla alakalı örnekteki gibi bu yüzden tam manasıyla oturması için biraz ilerlemem gerekiyor Neyin yapıcı fonksiyonla yapılıp yapılamıyacağı gibi.Mesela yapıcı fonksiyonsuz olmayacak yada saçma olacak bir örnek çıksa o zaman daha net anlıycam sanırım .Buda galiba zaman istiyecek gibi görünüyor tekrar teşekkürler
     
  6. Furkan Onka Uğur

    Furkan Onka Uğur Moderatör Yetkili Kişi

    Kayıt:
    12 Eylül 2008
    Mesajlar:
    3,713
    Beğenilen Mesajlar:
    48
    Şehir:
    Ankara
    Sevgili digrev, aslında biz bir yapıcı işlev tanımlamazsak, derleyici bizim yerimize bir tane oluşturur (nesnenin kurulması, yapıcı işlevin varlığına bağlıdır diyebiliriz. Felsefik olarak tabi.). Hatta biraz daha ilerleyince her sınıfın yapıcısıyla birlikte bir de bellekte yer ayıran kısmı (allocator) olduğunu da göreceksin.
     
  7. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    Bu konuların zaman alacağını anlamış olman güzel! :)

    Hemen, çok zaman kazandıracak bir bilgi: Hiçbir yapıyı veya sınıfı yapıcı fonksiyonsuz tanımlama. (Bu arada, kendim yazsam "kurucu işlev" diyorum.)

    Yukarıdaki ilkeyi gözardı etme tehlikesinden şüphelendiğim için bir kere daha: Hiçbir yapıyı ve sınıfı yapıcı fonksiyonsuz tanımlama.

    Bu konularda C++ çok tehlikeli olabiliyor: Örneğin, Onka'nın söylediği bile (kendisi de iyi bildiği gibi ;)) tam değil. Ne yazık ki, derleyicinin otomatik olarak oluşturduğu yapıcı fonksiyon temel türleri ilklemez.

    Örneğin aşağıdaki yapıyı yapıcı fonksiyonsuz tanımlamak hatadır:

    Kod:
    struct Nokta
    {
        int x;
        int y;
    
        Nokta(int xP = 0, int yP = 0)
            :
            x(xP),
            y(yP)
        {}
    };
    
    int main()
    {
        Nokta merkez(0, 0);
        Nokta buDaMerkez;
        Nokta n(10, 20);
    }
    
    Yararları:

    * Çöp değerleri olamaz

    * İlkleme zahmeti daha azdır

    Ali
     
  8. fyodor

    fyodor Aktif Üye

    Kayıt:
    3 Ekim 2010
    Mesajlar:
    384
    Beğenilen Mesajlar:
    0
    Meslek:
    Bilgisayar Mühendisliği(öğrenci)
    Ek bilgi olarak bazı dillerde sınıf için bellekte yer ayırma ve daha sonra sınıfı kurma ayrılmıştır. Mesela objective-c de bir sınıf oluşturmak için önce alloc metodu çağırılır ardından init metodu çağırılır.