2010-11-27 24 views
8

Olası Çoğalt: yapıcı bu koyarak üzerine başlatıcı listesi ile üye başlatılırken için bir avantaj olduğunu merak ediyordum
Benefits of Initialization listsBaşlatıcı listesini kullanmanın avantajları nelerdir?

. Bazı şeyler başlangıç ​​listesini kullanmak zorunda, ama olmayan şeylerin çoğunluğu için bir fark var mı? Sonunu tercih ederim çünkü birden fazla kurucu olduğumda, kodu yeniden kullanmak için yapı() 'yı çağırmayı tercih ederim.

Teşekkür

ilkel İçin

cevap

12

inşa etmek pahalılarsa verimsiz olabilir, üye veya temel sınıf açmadan küme ayracı önce inşa varsayılan alır.

Yani, çağrılar bir operator=() çağrı katacak daha sonra ayarlamak için. Eğer başlatıcı listesini kullanırsanız

, üye veya temel sınıf olarak adlandırılan uygun yapıcı vardır.

Sınıflarınızdan bağlı olarak, bu zorunlu ya da daha hızlı olabilir.

+0

Örnek bir örnek verebilirseniz yardımcı olabilirsiniz. –

10

, başlatıcı listelerini kullanarak veya atama yoluyla bunları inşa arasında hiçbir fark yoktur. Nesneleri oluştururken

Diğer türler için, başlatıcı listeleri size performans artışı göze olabilir.

(başlatıcı listelerindeki) başlatılıyor sırası sınıfında bildiriminde sırasına göre değişeceğine dikkat etmeyin. Bildirimler düzgün değilse ve elden önce başlatılan başka bir şeye bağlı olan verileri oluşturmanız gerekiyorsa, bu, 'olası kural olduğunda, başlatma listelerinin kullanılması' için bir istisnadır.

diğer bilgiler: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6 diğer sabitler ve referanslar için başlatıcı listesi kullanmak zorunda olmaktan çok onunla size üye nesneleri inşa varsayılan önlemek, çünkü aynı zamanda kullanışlı yapıcı girilmeden önce ve sonra hemen, atamadan

+0

Mükemmel yanıt. Eklemek istediğim bir nokta ... özel bir Init() işlevinde ilkellere değer atayan kurucunun bir kısmını yerleştirmek mantıklı olabilir (sahip olduğunuz kurucu sayısına göre).Bu, başlatıcı listelerinde kod çoğaltmayı önler. –

+0

@birryree argümanları dizisi hakkında güzel bir nokta, ilkel olmayanlar türünde başlatıcı listesini kullanmanın avantajlarını ayrıntılı olarak açıklayabilir misiniz. –

1

hangi üye nesneleri başlatıcı listesini kullanmak yoksa

2

Herkesin daha önce bahsettiği şeyden farklı olarak, gölge değişkenin açıklanmasına izin verir, bu yüzden this->var = var adresini yazmak zorunda kalırsınız, bunun yerine myclass(int var) : var(var)'u yapabilirsiniz. Tabii bazı insanlar bulabilir bu büyük bir yapıcısı Ayrıca

2

varsa başlatıcı listelerinde yönetilmeyen kaynak toplayabileceklerdir, asla okumak zor/çok kafa karıştırıcı. Diğer bir deyişle, ya "kaynak edinimi başlatılıyor" (bu yüzden yönetilmeyen kaynakları tamamen ortadan kaldırır) kullanın ya da kaynak oluşturmayı yapıcı gövdesinde gerçekleştirin.

Ve uyarı 2. hemen bir yönetici nesnesi (örneğin auto_ptr) için yeni bir kaynak verir, kendi kod açıklamada her kaynak tahsisi (örneğin yeni) gerçekleştirin.

http://www.gotw.ca/gotw/056.htm

İlgili konular