Thread overview
Kurucu Fonksiyon
Jul 10, 2009
quasimodo
Jul 15, 2009
erdem
Jul 15, 2009
erdem
Aug 03, 2009
Mengu
July 10, 2009
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?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 10, 2009

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2009

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2009

Alıntı (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 gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
July 15, 2009

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2009

Alıntı (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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 03, 2009

mesela c#'ta overloading diye bir durum var. http://tr.wikibooks.org/wiki/C_Sharp_Programlama_Dili/Metotlar#Metotlar.C4.B1n_a.C5.9F.C4.B1r.C4.B1_y.C3.BCklenmesi quasimodo ustadin sordugu soruya bir cevap midir bu?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 03, 2009

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]