2015-11-07 19 views
6

varsayılan bir kullanıcı tanımlı yapıcıVarsayılan (kullanıcı tanımlı) kurucu ve varsayılan bağımsız değişkenlerle kurucu arasındaki fark nedir?

class Simple 
{ 
public: 
    Simple() {} 
}; 

ve WithDefaults da yapabilirsiniz daha bu

class WithDefaults 
{ 
public: 
    WithDefaults(int i = 1) {} 
}; 

diğer her biri için varsayılan birden fazla argüman alır ama olan bir kullanıcı tanımlı yapıcısı arasında herhangi bir fark var mı i için açık bir değer ile inşa edilecek?

Özellikle, bu iki kurucu, her ikisi için de aynı varsayılan yapıcı rolünü oynarsa veya sınıfların özellikleri arasında ince farklar varsa, dil söz konusu olduğunda merak ediyorum.

Diğer bir deyişle, tüm argümanları için varsayılan değerleri her şekilde varsayılan bir kurucuya sahip bir kurucu mu?

+0

Bunun bir kopyasını beklediğimi düşünüyordum, ama bunu hiçbir yerde yanıtlayamıyorum. – MicroVirus

+0

Bu * hemen hemen * yanıtlandı [C++ yapıcılar ile varsayılan parametreler] (http://stackoverflow.com/questions/187640/default-parameters-with-c-constructors), sanırım, ama emin değilim. – MicroVirus

+1

İzole olarak, sınıfların aynı olduğunu düşünüyorum. Dönüşümler dikkate alındığında farklı davranabilirler. @MicorVirus tarafından yapılan ikinci yorumdaki bağlantı bunu daha da açıklıyor. –

cevap

6

Güncel Standart çalışılan taslak N4527 [12.1p4]:

bir sınıf X için varsayılan yapıcı sınıfının X bir yapıcı olduğunu ya hiç parametreleri veya başka bir değil her parametresi vardır işlev parametre paketi varsayılan bir argümana sahiptir. [...]

Evet, ikinci sınıfın kurucusu, mükemmel geçerli bir varsayılan kurucudur.


C++, 11 ve 14 yayınlanmış sürümlerinde anlatımın farklı, ama Sorunuz için bir fark yapmaz, sadece Not. bir sınıf X için

A varsayılan yapıcı bir tartışma olmadan çağrılabilir sınıfın X bir yapıcı geçerli: Eskiden.

akım ifadeler için değişim

varsayılan başlatma semantiğini netleştirmek amacıyla, DR 1630 sonucunda yapıldı. Önceden, " varsayılan yapıcısı" olarak adlandırılan, yalnızca bir tane olabileceğini ima eden standartlar vardı; Mevcut metnin daha karmaşık senaryoları desteklemesi amaçlanmıştır, ki burada bu tür birçok kurucuya (örneğin, SFINAE kullanarak) sahip olabilirsiniz ve kullanılan normal aşırı yük çözünürlüğü kullanılarak seçilir.

+0

Ancak *, * dikkate alınması gereken ABI uyumluluğu için küçük bir farktır. – Deduplicator

+1

@Deduplicator İyi bir nokta, ama sanırım bu genel ifadenin altına düşüyor "tüm parametreler için varsayılan argümanlara sahip olan bir işlev, herhangi bir sahip olmadığı ile aynı sözdizimi ile çağrılabilir, ancak bu iki anlama gelmez işlevlerin aynı imzası var ". – bogdan

İlgili konular