PDA

Tam Sürümünü Görmek İçin : constructor


quasimodo
14/05/2007, 18:55
class C {
public :
C(int );
private :
int sayi;
};

C::C(int sy) : sayi(sy) { }

class C {
public :
C(int );
private :
int sayi;
};

C::C(int sy)
{
sayi = sy;
}

Bazi durumlarda birincisi gibi yazmak "zorunlu" oldugu halde
( veri uyeler const, referans ... oldugunda), bu gibi bir class ta
bu constructor lar arasinda fark varmi ? Neden 1. si gibi yazilmali
veya neden 2. si gibi yazilmali?


golgepapaz
14/05/2007, 19:17
yazilmasi "zorunlu" olan sekil 1.sekildir, eger sayi referans ise. Cunku referanslar tekrar atanamazlar,ve ilklendirilmis olmalari gerekir(tekrar atanamadiklari icin), o yuzden uye ilklendirme listesinde(member initialization list) ilklendirilmeleri sarttir, onun disinda sanirim birincisisinde kopya kurucusu(copy constructor), ikincisinde ise atama isleci(assignment operator'u) cagriliyor, normalde ikisinde ayni isi yapmasi gerekir.(Eger siniflarini duzgun tasarlamissan...).

acehreli
14/05/2007, 19:36
Bir duzeltme: Ikincisinde kopyalayici degil, varsayilan kurucu kullanilir.

quasimodo'ya ozet olarak:

Ilk deger listesinde acikca kuruldugunda (birincisinde): Nesne yalnizca bir kere, senin sectigin sekilde kurulur. Dogrusu da budur. Hemen hemen her zaman, aksine bir neden yoksa bunu kullanmak gerek.

Ilk deger listesinde acikca kurulmadiginda (ikincisinde): Nesne once varsayilan kurucusu ile kurulur. (Kurucunun icine girildiginde kurulmustur bile; yoksa atama islecini kullanamazdik degil mi; kurulmamis bir nesneyi kullanamayiz.) Ondan sonra kurucunun icinde bir de sen atama isleci uygularsin. Bazi siniflarda bu fazla yavas bile olabilir.

Varsayilan kurucusu olmayan veya atanamayan butun nesneler ilk deger listesinde acikca kurulmalidirlar. (golgepapaz'in referans orneginde oldugu gibi.)

Gerisi senin istegine bagli oma hemen hemen her zaman ilk deger listesini kullanilir.

Ali

golgepapaz
16/05/2007, 03:46
Bir duzeltme: Ikincisinde kopyalayici degil, varsayilan kurucu kullanilir.


Ali

elbette sayi uyesi, kurucunun icine girmeden once varsayilan kurucuyla ilklendiriliyor, ben sayi=sy den bahsediyordum aslinda....

quasimodo ya, yani birincisi daha mantikli cunku ikincisi daha pahali..

acehreli
16/05/2007, 04:25
Ah! Yanlis okumusum. :) Tabii ki sayi(sy)'de kopya kurucusu...

Ali