2012-01-18 19 views
8

Son zamanlarda, iyi aldığım C++ FAQ numaralı kurucular hakkında çok fazla şey okuyordum. Girişlerden biri, sınıf üyelerini kurucunun kendisinin kod bloğu içinde başlatmanın aksine, başlatma listelerini kullanmak her zaman en iyisi olduğunu belirtmektedir.İşaretçi Olmayan Sınıf Üyelerinin Başlatılması

Bunun nedeni, derleyicinin yalnızca bir kopyadan ziyade sınıf üyelerinin birden çok kopyasını oluşturma eğiliminde olmasıdır.

İyi Örnek

Foo::Foo(void) 
    : mBar(new Bar) //pointer to some memory address 
{ 
} 

Bad Bu kurucular ilgili olsa da, devletler (ve

Foo::Foo(void) 
{ 
    mBar = new Bar; 
} 

bir şey, o da saf ilgilidir cinslerde nesnelerin başlatılması Hatta üye olmayan işlevlerden l) olacak şekilde aşağıdaki gibi yöntemlerle bir nesne başlatırken:

void f(void) 
{ 
    Foo foo(Bar()); //Bad. 

    foo.x(); //error 
} 

Göreceksin, ben alıntı: "[declare] a non-member function that returns a Foo object".

Hatta bu:

şu var

Soru Bundan dolayı

, bu akıllıca (daha fazla bilgi için, yukarıdaki bağlantıyı tıklayın)

Geometry::Geometry(void) 
    : mFaces(QVector<GLushort>), 
     mFinalized(false), 
     mNormals(QVector<QVector3D>), 
     mVerticies(QVector<QVector3D>) 

hese tahsis edilmiştir (yani, bunların işaretçiler olmadığı gerçeği), bu nesnelerin başlangıçta bile başlangıçta İHTİYAÇLARININ GEREKSİNİMİ OLMADIĞINI merak ediyor. Eğer yaparlarsa, bu doğru bir gidiş yolu mu? Veya daha iyi bir başlatma yöntemi var mı?

bunun nedeni C++ yapıcı başlatma arkasında metodoloji Ben cahil değilim gerçeği ile birlikte, yapıcı işlevlerini kullanarak hem başlatılıyor nesnelere ilişkin bu şekilde söz

Bu genel soru ile ilgilidir ilgilidir nasıl yığında tahsis edilen nesnelerin olup olmadığına - veya, yine de inanıyorum ki - (her iki şekilde de, işaret ayırmadan nesneler) bile, ilk etapta başlatmaya ihtiyaç duyar.

cevap

12

Bir üye değişkeni, kullanıcı tarafından bildirilen varsayılan kurucuya sahip bir sınıf türündeyse, başlangıç ​​listesinde açıkça belirtmeniz gerekmez: varsayılan yapıcısı, yapım sırasında, yapım sırasında, daha önce de çağrılır. kurucu girilir.

üye değişkeni (int veya bool gibi) temel bir tür olması veya herhangi bir kullanıcısının bildirdiği kurucular sahip olmayan bir sınıf türde ise

, sen aksi takdirde başlatılmaz, açıkça başlatmak gerekir (ve bilinmeyen bir değere sahip olacaktır, başlatılmamış bir nesneyi okuyamazsınız).

+0

Yani, yukarıdaki kodlara göre, sadece ayırdığım nesnelerin birden çok kopyasını yaratıyorum? – zeboidlund

+3

'mFaces (QVector < GLushort >())' işlevini kullandığınızda, geçici bir QVector 'oluşturun, bu geçici nesneden 'mFaces' yapısını kopyalayın ve sonra bu geçici nesneyi yok edin. Yani, evet, gereğinden fazla nesne yaratıyorsun. –