Yapıcı başlatma listesi değerlendirme sırası


252

Bazı argümanlar alan bir yapıcı var. Listelenen sırayla inşa edildiğini varsaymıştım, ancak bir durumda, bir kürtajla sonuçlanan tersine inşa edildikleri görülüyor. Argümanları ters çevirdiğimde program iptal etmeyi bıraktı. Bu, kullandığım sözdiziminin bir örneğidir. Mesele şu ki, a_ bu durumda b_'den önce başlatılmalıdır. İnşaat siparişini garanti edebilir misiniz?

Örneğin

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};

6
Yapıcı argümanlarını sorduğunuzu söylüyorsunuz, ancak yapıcıya ulaşmadan önce değerlendiriliyorlar ve belirtilmemiş, derleyici tarafından belirlenen bir sırayla değerlendiriliyorlar. Ama gerçekten başlatma listelerinin sırasını soruyorsunuz, bu yüzden sizin için soru başlığını değiştirdim.
Rob Kennedy

Yanıtlar:


278

Sınıftaki üye değişken bildiriminin sırasına bağlıdır. Öyleyse a_ilk b_olacak , sonra da örneğinizdeki ikinci olacak.


22
Aslında, deklarasyonda yapıcı başlatma listesine göre farklı bir düzeniniz varsa iyi derleyiciler uyarır. Örneğin, bkz -Wreorder. Gcc.
Greg Hewgill

237
Yapıcıdaki sırayla değil, üye beyan düzeninde oluşturulmalarının nedeni, birden fazla kurucuya sahip olabilmeleridir, ancak sadece bir yıkıcı vardır. Ve yıkıcı, inşaatın ters sırasında üyeleri yok eder.
AProgrammer

3
kastettik mi ... tersine beyan. "İnşaat" değil, yıkıcı muhtemelen bilmek için yapıcı içine görmek mümkün değil mi?
Conrad B

196

Standardı açıklamak için, açıklama için:

12.6.2.5

Başlatma aşağıdaki sıraya göre yapılır:

...

  • Daha sonra statik olmayan veri üyeleri, sınıf tanımında beyan edildikleri sırayla başlatılır (yine mem-başlatıcıların sırasına bakılmaksızın).

...


18

Bunun için standart referans şimdi 12.6.2 bölüm 13.3 olarak görülmektedir:

(13.3) - Daha sonra, statik olmayan veri üyeleri sınıf tanımında bildirildikleri sırayla başlatılır (yine mem-başlatıcıların sırasına bakılmaksızın).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.