Forum: D Programlama Dili RSS
Kurucu Fonksiyon
quasimodo (Moderatör) #1
Üye Haz 2009 tarihinden beri · 12 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kurucu Fonksiyon
class A
{       int a;
        int b;
        this() { a = 7; b = foo(); } 
        this(int x)
        {
            this();
            a = x;
        }
}

Kurucu fonksiyon icinden kendi kurucusunu cagirabilmenin mantigi nedir?
Karaali
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu C++'ta çok aranan bir olanaktır. İki tane birbirine çok yakın kurucu olduğunu düşünelim. Aynı şeyleri yapsınlar, ama ikincisini bir üyeyi daha değiştirsin.

Kod tekrarı olmaması için ikincisinden birincisini çağırabilmeliyiz. C++'ta olanaksızdır.

class C
{
    int a_;
    int b_;
    int c_;
 
public:
 
    C(int a, int b)
        :
        a_(a),
        b_(b),
        c_(0)   // normalde 0
    {}
 
    C(int a, int b, int c)
        :
        C(a, b), // <-- C++'da istenir ama yapilamaz
        c_(c)
    {}
};

Ali
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tabi burada da C++'den alıştığımız : dan sonraki ilklendirme listelerini kullanamıyoruz:

import std.stdio;
 
 
class C
{
    int a_;
    int b_;
    int c_;
 
    this (int a, int b)
    {
        a_ = a;
        b_ = b;
        c_ = 0; // normalde 0
    }
 
    this (int a, int b, int c)
    {
        this (a,b)// <-- C++'da istenir ama yapilamaz
        c_ = c;
    }
}
 
void main ()
{    
}
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
D'de kurma adımları şurada anlatılıyor (İngilizce):

  http://www.digitalmars.com/d/2.0/class.html#Constructor

D'de her üye this()'e girildiğinde ilklenmiş oluyor. C++'dan farklı olarak, temel türler de 0 veya NaN değerini alıyorlar. (C++'da ilkleme listesinde ancak biz benim_int() gibi yazarsak ilklenir).

Üst türün kurucusunu kendimiz super() diye çağırmazsak C++'da da olduğu gibi derleyici tarafından en başta çağrılıyor. Ama biz super()'i kurucu içinde herhangi bir yerde çağırmışsak derleyici bunu görüyor ve super()'i çağırmıyor.

D'de kurma olayı daha çok C gibi: üyelerin değerlerinin verildiği sıra bize kalmış... Tek fark, bütün üyeler önce sıfırlanıyorlar; C'deki gibi calloc() veya memset()'e gerek yok.

Ali
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
erdem:
Tabi burada da C++'den alıştığımız : dan sonraki ilklendirme listelerini kullanamıyoruz:

import std.stdio;
 
 
class C
{
    /* ... */
 
    int c_;
 
    this (int a, int b)
    {
        c_ = 0; // normalde 0
    }
 
   
}
 
void main ()
{    
}

O zaman buradaki c_ = 0 kısmına da gerek kalmıyor anladığım kadarıyla. Çünkü kurucu çalıştırılmadan önce tamsayılar (int) 0 ve kayar noktalı sayılar (float) NAN diye bir değere ilklendiriliyormuş.
(biraz hızlı okumuşum bu kısmı siz de yazmışsınız   :-)  )
Bu mesaj erdem tarafından değiştirildi; zaman: 2009-07-15, 17:43.
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
O zaman buradaki c_ = 0 kısmına da gerek kalmıyor anladığım kadarıyla. Çünkü kurucu çalıştırılmadan önce tamsayılar (int) 0 ve kayar noktalı sayılar (float) NAN diye bir değere ilklendiriliyormuş.

Kabul! :)

Ali
Mengu (Moderatör) #7
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
mesela c#'ta overloading diye bir durum var. http://tr.wikibooks.org/wiki/C_Sharp_Programlama_Dili/Meto… quasimodo ustadin sordugu soruya bir cevap midir bu?
http://www.mengu.net - some kind of monster
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, aşırı yükleme... Ama burada C++'la karşılaştırılan bir olanak var: C++'dan bir kurucu içinden başka bir kurucu fonksiyon çağrılamaz, çünkü kurucu fonksiyonun adını yazmak C++'ta bir nesne oluşturmak anlamına gelir.

class Sinif
{
public:
 
    Sinif()
    {}
 
    Sinif(int i)
    {
        // C++'ta diger kurucuyu cagirmaz; isimsiz ve gecici
        // bir nesne olusturur:
        Sinif();
    }
};

D'de ise this() kurucuyu çağırır. C++'tan bir farkı...

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 07:48:58 (UTC -08:00)