SORU
21 NİSAN 2015, Salı


Varsayılan değer sıfır başlatma karmaşa

Değer ve varsayılan & sıfır-başlatma konusunda çok kafam karıştı. ve özellikle farklı standartlar için onlar tekme zamanC 03veC 11(veC 14).

Ben alıntı ve çalışıyor uzatmak gerçekten çok iyi bir cevap Value-/Default-/Zero- Init C 98 and C 03 yapmak için burada daha genel olarak çok yardımcı olacak bir sürü kullanıcıları eğer birisi yardım edebilir doldurmanız gereken boşluklar var iyi bir bakış ne durumda?

Özetle örneklerle tam ınsight:

Bazen hafıza döndürülen yeni operatör olacak başlatıldı, ve bazen yaramaz olmasına bağlı olarak bir tipsin newing bir POD (plain old data) ya da eğer bir sınıf içeren POD üyeleri ve kullanarak bir derleyici tarafından oluşturulan varsayılan kurucu.

  • C 1998başlatma 2 tipi vardır: varsayılan sıfır
  • C 2003başlatma değeri başlatma 3. Bir tür eklendi.
  • 2011 C/C 2014sadece liste-başlatma eklendi ve değer-/default-/sıfır-başlatma için kuralları biraz değişti.

Varsayalım:

struct A { int m; };                     
struct B { ~B(); int m; };               
struct C { C() : m(){}; ~C(); int m; };  
struct D { D(){}; int m; };             
struct E { E() = default; int m;} /** only possible in c  11/14 */  
struct F {F(); int m;}  F::F() = default; /** only possible in c  11/14 */

C 98 derleyici, aşağıdaki gerçekleşmelidir:

  • yeni A - belirsiz değer (POD)
  • () yeni Bir - -başlatılamıyor sıfır
  • yeni B - varsayılan inşa (:: B m başlatılmamış olması, B non-POD)
  • () yeni B - inşa varsayılan (:: B m başlatılmamış)
  • yeni C - varsayılan inşa (:: C m sıfır-başlatıldı, C non-POD)
  • () yeni C - inşa varsayılan (:: C m sıfır başlatıldı)
  • yeni D - varsayılan inşa (:: D m başlatılmamış olması, D non-POD)
  • () yeni D -varsayılan oluşturmak?(:: D m başlatılmamış)

C 03 uyumlu bir derleyici, her şey çok gibi çalışması gerekir:

  • yeni A - belirsiz değer (POD)
  • () yeni Bir değer başlatma bir BÖLME olduğu için sıfır başlatma olan,.
  • yeni B - varsayılan-başlatır (yapraklar B::m başlatılmamış, B non-POD)
  • () yeni B varsayılan decimal kullanıcı tanımlı olarak karşı oluşturulan derleyici olduğundan başlatır sıfır tüm alanları olan değer B başlatır.
  • yeni C - varsayılan-varsayılan başlatır decimal aranmasına, C,. (:: C m sıfır-başlatıldı, C non-POD)
  • () yeni bir C - değeri-başlatır varsayılan decimal. çağıran C, (:: C m sıfır başlatıldı)
  • yeni D - varsayılan inşa (:: D m başlatılmamış olması, D non-POD)
  • () yeni D -değer-D başlatır?varsayılan decimal çağıran, (:: D m başlatılmamış)

İtalik değerler ve ? belirsizlikler, yardım bunu düzeltmek için lütfen :-)

C 11 uyumlu bir derleyici, her şey çok gibi çalışması gerekir:

??? (eğer zaten yanlış olur çalıştırabilirsem yardım lütfen

C 14, uyumlu bir derleyici, her şey çok gibi çalışması gerekir: ??? (lütfen yardım zaten yanlış burada başlar (Taslak yanıta göre)

  • yeni Bir varsayılan başlatır, derleyici gen. , (leavs A::m) başlatılmamış decimal (POD)
  • () yeni Bir - değer-başlatır,-başlatma sıfır 2'den beri. nokta[malzeme.ınit] 8/

  • yeni B - varsayılan-başlatır B, derleyici gen. , (leavs A::m) başlatılmamış decimal (B non-POD)

  • () yeni B varsayılan decimal kullanıcı tanımlı olarak karşı oluşturulan derleyici olduğundan başlatır sıfır tüm alanları olan değer B başlatır.
  • yeni C - varsayılan-varsayılan başlatır decimal aranmasına, C,. (:: C m sıfır-başlatıldı, C non-POD)
  • () yeni bir C - değeri-başlatır varsayılan decimal. çağıran C, (:: C m sıfır başlatıldı)
  • yeni D - varsayılan-başlatır D (:: D m başlatılmamış olması, D non-POD)
  • () yeni D - değer başlatır varsayılan decimal aramalar D (:: D m başlatılmamış)
  • yeni comp çağıran E - varsayılan-başlatır E,. gen. decimal. (:: D m başlatılmamış olması, D non-POD)
  • () yeni E - değer başlatır başlatır sıfır olan E, E 2 noktası bu[malzeme.ınit] 8/)
  • yeni comp çağıran F - varsayılan-başlatır F,. gen. decimal. (:: D m başlatılmamış olması, D non-POD)
  • () yeni F - değeri F başlatırvarsayılan başlatır1 beri F. nokta[malzeme.ınit] 8/(Bir işlevi varsa, kullanıcı ilan ve açıkça ya da ilk beyanı temerrüde silinirse kullanıcı tarafından sağlanır. Link)

CEVAP
21 NİSAN 2015, Salı


C 14 nesneleri new [ifade ile oluşturulan başlatma belirtir yeni]/17 ([ifade.yeni] C/15 11 ve not not ama normatif bir metin değildi.):

Biryeni ifadeT o başlatır türde bir nesne oluşturur aşağıdaki gibi nesne

  • Eğeryeni başlatıcıatlandı, nesnedirvarsayılan başlatıldı(8.5). [Not:Eğer başlatma ise yapılan, nesnesi belirsiz bir değeri vardır.— not end]
  • Aksi takdirdeyeni başlatıcı8.5 . başlatma kurallarına göre yorumlanır ^em>direkt başlatma.

Varsayılan başlatma [malzeme.tanımlanır ınit] 7/C 11 ve aynı etkiyi kendisi kelimelerde/6):

İçinvarsayılan-başlatılamıyorT demek türde bir nesne:

  • T T (muhtemelen cv-nitelikli) bir sınıf türü (Madde 9), varsayılan yapıcı (12.1) olarak adlandırılır (ve başlatma eğer eğer T varsayılan varsa kötü oluşan kurucu veya aşırı çözümleme (13.3) fonksiyonu bir belirsizlik içinde veya sonuçları veya silinmiş. bağlam başlatma) erişilemiyor;
  • eğer T dizi bir tür ise, her bir unsurudurvarsayılan başlatıldı;
  • aksi takdirde, hiçbir başlatma gerçekleştirilir.

Böylece

  • new A sadece m başlatmıyor As varsayılan yapıcı olarak adlandırılan neden olur. Belirsiz değer. new B için aynı olmalıdır.
  • new A() göre [malzeme.yorumlanır başlangıç]/11 C 11/10):

    Boş bir parantez ayarlanmış bir nesne, yani, (), katma başlatılmış olacaktır.

    Ve şimdi düşünün [malzeme.ınit] 8/(C/11 7†):

    İçindeğer başlatılamadıT demek türde bir nesne:

    • ya varsayılan yapıcı (12.1) veya varsayılan bir kurucu ile T (muhtemelen cv-nitelikli) bir sınıf türü (Madde 9) -sağlanan kullanıcı veya silinmiş, nesnenin varsayılan başlatıldı;
    • T (muhtemelen cv-nitelikli) bir sınıf tarafından sağlanan kullanıcı silinmiş veya varsayılan bir yapıcı olmadan yazarsanız, o zaman nesne sıfır başlatılan ve anlamsal kısıtlamaları varsayılan başlatma T önemsiz olmayan bir varsayılan varsa kontrol edilir yapıcı, nesnenin varsayılan başlatıldı;
    • eğer T dizi bir tür ise, o zaman her eleman değer başlatıldı;
    • aksi halde, nesnenin sıfır başlatıldı.

    Dolayısıyla new A()-başlatma sıfır m. Ve bu A B eşdeğer olmalıdır.

  • new C new C() ilk kurşun son teklif geçerlidir (C kullanıcı tarafından sağlanan varsayılan bir kurucusu vardır!) noktadan itibaren varsayılan başlatma nesneyi tekrar eder. Ama görülüyor ki, şimdi m Her iki durumda da kurucu başlatıldı.


† Bu paragraf biraz farklı bir ifade var C sonucu değiştirmez 11,:

İçindeğer başlatılamadıtüründe bir nesne T anlamına gelir:

  • bir T (muhtemelen cv-nitelikli) bir sınıf türü (Madde 9) kullanıcı tarafından sağlanan yapıcı (12.1), *28 için varsayılan kurucuyu sonra* başlatma T erişilebilir varsa hiçbir kötü biçimlendirilmiş (ve denir kurucu varsayılan);
  • T (muhtemelen cv-yetkili olmayan sendika ise sınıf türü tarafından sağlanan kullanıcı yapıcısı olmadan, bir nesne sıfır başlatılmış ve T’nin örtülü olarak bildirilen varsayılan kurucu önemsiz değil, yapıcı olarak adlandırılır.
  • eğer T dizi türü, sonra her elemanı değer başlatıldı;
  • aksi takdirde, nesne sıfır başlatıldı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014
  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008
  • New Challenger - Game Reviews

    New Challeng

    20 Temmuz 2006