İlk bakışta, basit sözdizimsel şeker gibi görünüyor.
Ancak daha derinlere baktığımızda , C ++ kullanıcı seçeneklerini tam olarak farklı yerleşik türler gibi davranan kullanıcı tanımlı türler oluşturmak için genişlettiği için sözdizimsel şekerden daha fazlası olduğunu görüyoruz . Bu, bu küçük "bonus" C ++ için çok ilginç bir C ++ 11 ekidir.
Gerçekten C ++ ile ihtiyacımız var mı?
Son yıllarda yazdığım kodda birkaç kullanım görüyorum, ancak sadece C ++ ile kullanmadığım için başka bir C ++ geliştiricisi için ilginç olmadığı anlamına gelmiyor .
C ++ (ve C, sanırım), derleyici tanımlı değişmez değerler, tamsayı sayılarını kısa veya uzun tamsayılar, gerçek sayıları float veya double (veya hatta double double) ve karakter dizelerini normal veya geniş chars olarak yazmak için kullandık .
C ++ 'da, potansiyel olarak ek yük olmadan (satır içi, vb.) Kendi türlerimizi (yani sınıflar) yaratma imkanımız oldu . Türlerine operatör ekleme, benzer yerleşik türler gibi davranmalarını sağladık, bu da C ++ geliştiricilerinin dilin kendisine eklenmiş olmaları gibi doğal olarak matrisleri ve karmaşık sayıları kullanmalarını sağlıyor. Döküm operatörleri bile ekleyebiliriz (bu genellikle kötü bir fikirdir, ancak bazen sadece doğru çözümdür).
Kullanıcı türlerinin yerleşik türler gibi davranması için bir şeyi kaçırdık: kullanıcı tanımlı değişmez değerler.
Yani, sanırım bu dil için doğal bir evrim, ama olabildiğince eksiksiz olmak için: " Eğer bir tür oluşturmak istiyorsanız ve onun yerleşik türler kadar mümkün olmasını istiyorsanız, işte araçlar. .. "
Sanırım her ilkel, boolean, integer, vb. Dahil bir yapı yapma kararına çok benziyor ve tüm yapıların Object'den türetilmesini sağlıyor. Bu karar tek başına Java'nın özelliklerine ne kadar boks / kutudan çıkarma korsanlığı olursa olsun, ilkellerle çalışırken .NET'i Java'nın erişiminin çok ötesine taşır.
Gerçekten C ++ ihtiyacınız var mı?
Bu soru SİZİN cevaplamanız içindir. Bjarne Stroustrup değil. Herb Sutter değil. C ++ standart komitesinin herhangi bir üyesi değil. Bu yüzden C ++ seçeneğine sahipsiniz ve kullanışlı bir gösterimi yalnızca yerleşik türlerle sınırlamazlar.
Eğer sen lüzum, o zaman hoş bir ektir. Eğer sen değil, iyi ... kullanmayın. Size hiçbir maliyeti olmayacak.
Özelliklerin isteğe bağlı olduğu C ++ diline hoş geldiniz.
Şişirilmiş ??? Bana komplekslerini göster !!!
Şişirilmiş ve karmaşık (pun amaçlı) arasında bir fark vardır.
Niels tarafından gösterildiği gibi Kullanıcı tanımlı değişmez değerler C ++ 'a hangi yeni özellikleri ekler? , karmaşık bir sayı yazabilmek C ve C ++ 'ya "son zamanlarda" eklenen iki özellikten biridir:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
Şimdi, hem C99 "çift karmaşık" tipi ve C ++ "std :: karmaşık" tipi, operatör aşırı yüklenmesi kullanılarak çoğaltılabilir, eklenebilir, çıkarılabilir, vb.
Ancak C99'da, yerleşik tip olarak başka bir tür ve yerleşik operatör aşırı yükleme desteği eklediler. Ve başka bir yerleşik değişmez özellik eklediler.
C ++ 'da sadece dilin mevcut özelliklerini kullandılar, gerçek özelliğin dilin doğal bir evrimi olduğunu gördüler ve böylece eklediler.
C'de, başka bir tür için aynı gösterim geliştirmeye ihtiyacınız varsa, kuantum dalga işlevlerinizi (veya 3D noktalarınızı veya çalışma alanınızda kullandığınız temel türü) eklemek için lobinize kadar şansınız kalmaz. Yerleşik tip olarak C standardı başarılı.
C ++ 11'de bunu kendiniz yapabilirsiniz:
Point p = 25_x + 13_y + 3_z ; // 3D point
Şişirilmiş mi? Hayır , hem C hem de C ++ komplekslerinin gerçek karmaşık değerlerini temsil etmek için bir yola nasıl ihtiyaç duydukları ile gösterildiği gibi ihtiyaç vardır.
Yanlış mı tasarlanmış? Hayır , genişletilebilirlik göz önünde bulundurularak diğer tüm C ++ özellikleri gibi tasarlanmıştır.
Sadece gösterim amaçlı mıdır? Hayır , kodunuza tip güvenliği bile ekleyebilir.
Örneğin, bir CSS yönelimli kod düşünelim:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
Bu durumda, değerlerin atanmasına güçlü bir yazım uygulamak çok kolaydır.
Tehlikeli mi?
İyi soru. Bu işlevler ad boşluklu olabilir mi? Evetse, Jackpot!
Her neyse, her şey gibi, bir araç yanlış kullanılırsa kendinizi öldürebilirsiniz . C güçlüdür ve C tabancasını kötüye kullanırsanız başınızı vurabilirsiniz. C ++ 'da C tabancası vardır, ancak aynı zamanda neşter, taser ve araç setinde bulabileceğiniz diğer araçlar da vardır. Neşteri kötüye kullanabilir ve kendinizi ölüme kanabilirsiniz. Veya çok zarif ve sağlam bir kod oluşturabilirsiniz.
Yani, her C ++ özelliği gibi, gerçekten ihtiyacınız var mı? C ++ 'da kullanmadan önce cevaplamanız gereken soru budur. Eğer yapmazsan, sana hiçbir maliyeti olmayacak. Ama gerçekten buna ihtiyacınız varsa, en azından dil sizi yarı yolda bırakmaz.
Tarih örneği?
Hatanız, bana öyle geliyor ki, operatörleri karıştırıyorsunuz:
1974/01/06AD
^ ^ ^
Bundan kaçınılamaz, çünkü operatör / derleyici onu yorumlamalıdır. Ve AFAIK, bu iyi bir şey.
Sorununuza bir çözüm bulmak için, hazır kelimeyi başka bir şekilde yazardım. Örneğin:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
Şahsen, tamsayıyı ve ISO tarihlerini seçerdim, ancak bu SİZİN ihtiyaçlarınıza bağlıdır. Bu, kullanıcının kendi gerçek adlarını tanımlamasına izin vermenin tüm noktasıdır.