Modern C ++ daha yaygın hale geliyor mu? [kapalı]


132

C ++ 'ı 6-7 yıl önce ilk öğrendiğimde, temelde "Sınıflarla C" yi öğrendim. std::vectorGelişmiş bir konu, size eğer öğrenmek bir şey kesinlikle gerçekten istedi. Ve kesinlikle kimse bana hafızayı yönetmeye yardımcı olmak için yıkıcıların kullanılabileceğini söylemiyordu. Bugün baktığım her yerde RAII ve SFINAE ve STL ile Boost ve modern C ++ görüyorum . Dile yeni başlayan insanlara bile bu kavramlar neredeyse 1. günden itibaren öğretiliyor gibi görünüyor.

Sorum şu, sadece "en iyi" yi, yani burada SO'daki ve yeni başlayanları çekme eğiliminde olan diğer programlama sitelerindeki soruları (gamedev.net) gördüğüm için mi, yoksa bu aslında C ++ topluluğu bir bütün olarak mı?

Modern C ++ gerçekten varsayılan hale mi geliyor? Uzmanların hakkında yazdıkları süslü bir şey olmaktan ziyade, "C ++ olduğu gibi" mi oluyor? Yoksa hala "sınıflarla C" yi öğrenen ve kullanmak yerine kendi dinamik dizilerini yazan binlerce insanı göremiyor muyum std::vectorve üst düzey kodlarından manuel olarak new / delete çağırarak bellek yönetimi yapıyor muyum?

Her ne kadar inanmak istesem de, C ++ topluluğunun bir bütün olarak temelde birkaç yıl içinde bu kadar gelişmesi inanılmaz görünüyor. Deneyimleriniz ve izlenimleriniz neler?

(feragatname: C ++ 'ya aşina olmayan biri, başlığı, C ++' nın diğer dillere göre popülerlik kazanıp kazanmadığını sorarak yanlış yorumlayabilir. Bu benim sorum değil. "Modern C ++", C ++ içindeki bir lehçe veya programlama stili için yaygın bir addır ve kitabın adını taşır " Modern C ++ Tasarımı: Uygulanan Genel Programlama ve Tasarım Kalıpları "ve ben sadece bununla" eski C ++ "ile ilgileniyorum. Bu yüzden bana C ++ 'ın zamanının geçtiğini ve hepimizin Python kullanmamız gerektiğini söylememe gerek yok;))


2
Maalesef, C ++ topluluğunun bir bütün olarak standart kitaplığın nasıl kullanılacağını tanımak ve benzer metodolojileri kullanarak kodu etkili bir şekilde uygulamak bir yana, yaklaşan C ++ 0x eklemeleriyle birlikte güçlendirmek için yeterince gelişmiş olmasının biraz zaman alacağını düşünüyorum. Bununla birlikte, C ++ 0x'in C ++ popülerliğini artırmak için çok umut verdiğini düşünüyorum. Birçok günlük sözdizimsel rahatsızlık iyileştirildi. Bunları her zaman önemsiz olarak düşünmüşümdür, ancak dile bakan dışarıdan insanlar için bu ortak bir şikayet kaynağıdır.
stinky472

15
Benim durumumda, RAII gibi modern C ++ tekniklerini ve istisna güvenliği (mutlaka Alexandrescu'nun kitabına atıfta bulunmak zorunda değildir) veya yineleyiciler ve genel algoritmalar gibi en temel kavramları anlayan bir profesyonelle karşılaştığımda, anlamayan on tane daha buluyorum. En azından profesyoneller söz konusu olduğunda, birçoğu bildiklerini öğrenemeyecek kadar son teslim tarihlerine kapılmış durumdadır, bu nedenle kendi kendini ilan eden C ++ profesyonellerinin bile öğreneceği çok şey vardır. Korkarım ben de C ++ 0x olanlardan biri oluyorum: bunun için öğrenmem ve ayarlamam gereken çok şey var ve yerine getirmem gereken son tarihler var.
stinky472

Yanıtlar:


76

İşte işlerin nasıl geliştiğini düşünüyorum.

C ++ programcılarının ilk nesli, aslında C ++ 'ı sınıflarda C olarak kullanan C programcılarıydı. Artı, STL henüz yerinde değildi, bu yüzden C ++ esasen buydu.

STL ortaya çıktığında, bu ileri şeyler, ancak çoğu insan kitap yazarken, müfredatı bir araya getirerek ve dersleri öğretirken önce C'yi, sonra fazladan C ++ ile ilgili şeyleri öğrendi, bu nedenle ikinci nesil bu bakış açısıyla öğrendi. Başka bir yanıtın da belirttiği gibi, döngüler için düzenli yazmakta rahatsanız, kullanıma geçmek, std::for_eachişleri "modern" şekilde yaptığınızın sıcak ve tüylü hissi dışında size pek bir şey kazandırmaz.

Şimdi, Koenig & Moo's Accelerated C ++ ve Stroustrup'un yeni ders kitabı gibi tüm C ++ 'yı kullanan ve talimatlarını bu perspektiften alan eğitmenlerimiz ve kitap yazarlarımız var. Bu yüzden öğrenmek yoktur char*o zaman std::strings.

Bu, "eski" yöntemlerin değiştirilmesinin ne kadar süreceği konusunda ilginç bir derstir, özellikle de etkinlik geçmişine sahip olduklarında.


13
Evet. C ++ 'ı C kodlayıcılarının büyük bir kurulu tabanı nedeniyle geriye dönük olarak C ile uyumlu hale getirmek çok akıllıcaydı. MS'in DOS ile her zaman geriye dönük uyumluluğu sürdürme konusundaki başarılı stratejisine çok benzer. (Raymond Chen'in mükemmel bloguna gittikleri sık sık acı veren uzunluklar için bakın ...)
j_random_hacker

2
Hay aksi, orada biraz teğet geçti ... C'den geçiş yapanlar (ancak C tarzı düşünmeyi sürdürenler) ile "ilk tadı olanlar arasındaki" kuşak ayrımı "konusunda haklı olduğunuzu düşünüyorum demek istiyorum. "STL sonrası C ++ idi.
j_random_hacker

57

Kesinlikle evet. Bana göre, bu "Modern C ++" tarzında C ++ programlamıyorsanız, o zaman C ++ kullanmanın bir anlamı yok! C'yi de kullanabilirsiniz. "Modern C ++" benim görüşüme göre C ++ 'nın programlanmasının tek yolu olmalı ve C ++ kullanan ve bu "Modern" tarzda programlayan herkesin benimle aynı fikirde olmasını bekliyorum. Aslında, auto_ptr veya ptr_vector gibi şeylerin farkında olmayan bir C ++ programcısını duyduğumda her zaman tamamen şok oluyorum. Bana kalırsa, bu fikirler temel ve C ++ için temel ve bu yüzden başka türlü düşünemedim.


4
+ 1; "Modern c ++" stilini erkenden aldım çünkü bunu yapmanın doğal yolu budur (eğer C'yi derslerle düşünmüyorsanız).
Adam Hawes

21
"Sadece C mi kullanacaksınız?" C çok güçlü.
Clark Gaebel

4
Robotlar kesinlikle C ++ ile programlama yapmayacak, yeterince aptal değiller ve onu derlemeye çalışırken donacaklar.
Matt Joiner

6
@ClarkGaebel Pekala, eğer C güçlüyse, sorunları olmadan C'den miras olarak C ++ da
öyledir

4
@rxantos, performansı değerlendirmek için pek çok seçeneğimiz olmadığını söylüyorsunuz, örneğin montaj çıkışını, zamanlayıcıları, RAM monitörlerini ve daha fazlasını görüntüleme. C ++ bu açıdan C'den farklı değildir. Şüpheniz varsa, profil. Başka her şey söylentidir.
underscore_d

25

Windows 3.1 günlerinde standart C idi. C ++ geliştirici pazarına girdiğinde ve daha sonra ANSI standardı haline geldiğinde, yeni ilgi gördü. OOP kısaltmasını ve polimorfizmi kullanarak bazı temel tasarım modellerini popüler hale getirdi.

Şimdi, C # /. NET gibi düşük giriş engelli yönetilen platformların daha fazla kabul görmesiyle, C ++ kullanmak için daha az neden var. Geliştirici tabanının çoğunun bir seçeneği olacak ve dürüst olalım: C ++ bir acemi için öğrenilmesi gereken bir ayı. C # ile sadece onunla koşabilirsiniz.

Bu, sanatı uygulamaya devam etmek için gerçekten sadece C ++ İHTİYACI olan platformları ve ölümcül C ++ evanjelistlerini bırakıyor. Bu, "Modern C ++" olarak kabul edilen tüm soyutlama katmanlarına ihtiyaç duyan ve isteyen topluluktur.

Yani evet, sizin belirttiğiniz gibi "Modern C ++" nın daha yaygın hale geldiğine inanıyorum. Yine de, geçmişte kullandığından farklı bir izleyici kitlesinde yaygın.


Hadi çocuklar, bu cevap bazı iyi noktalara işaret ediyor. C ++ mükemmel değil, hepimiz biliyoruz ki Bjarne bunun çok büyük ve öğrenmesi çok zor olduğundan şikayet ediyor. Modern C ++ 'nın neden bu kadar kademeli olarak ortaya çıktığı konusunda hemfikir olmama rağmen - IMHO, böylesine büyük bir dilin "ileriye doğru gürlemesi" bu kadar uzun sürüyor.
j_random_hacker

4
Yani, daha ortalama geliştiricilerin C # ve benzerlerine yöneldiğini, daha sert çekirdeklerin ise C ++ ile daha çok uğraştığını mı söylüyorsunuz? (Gerçekten zeki C # /. NET insanları olmadığından değil, ama daha az zeki olanların birçoğu var.) Belli bir anlam ifade ediyor.
David Thornley

3
Bunun geçerli bir nokta olduğunu düşünüyorum. Elbette bu herkes için doğru değil, ancak büyük ölçüde katılıyorum, bir seçeneği olan çoğu insan C # veya Java ya da bu tür diğer dilleri tercih etti.
jalf

3
Kullanım durumları: Bir Windows istemcisinin veritabanımda CRUD yapmasını istiyorum. C # /. NET veya C ++ / MFC mi kullanıyorsunuz? Bir web uygulaması istiyorum ... C # / ASP.NET veya C ++ / ISAPI mı kullanıyorsunuz? DirectX C # /. NET veya C ++ / MFC / WTL kullanarak basit bir "Nybbles" klonu istiyorum? Assembly09'da kazanan bir demo istiyorum ... kesinlikle C ++ (vs. C #).
spoulson

8
Bunun daha fazla soyutlama katmanı mı yoksa daha çok ölümcüllük meselesi mi bilmiyorum. Sanırım şablonlar aracılığıyla kullanılabilen türden soyutlamalar Java veya C # için mevcut değildi, bu yüzden onları seven veya bunlara ihtiyaç duyan insanlar C ++ ile kaldılar.
Kragen Javier Sitaker

16

STL ile nasıl çalışılacağını öğrenen ve 1. günden itibaren RAII ve iyi C ++ programlama uygulamaları hakkında çok şey duyan bu adamlardan biriyim. Bugün C ++ öğrenmek için en çok tavsiye edilen kitaplardan bazılarına benziyor (Hızlandırılmış C ++ ve Etkili C ++ serisi gibi) ) kendi işlerinizi toplamak yerine STL araçlarını kullanmaya odaklanın ve ayrıca etkili (veya "modern") programlama için birçok "kural" verin.

Ama arkadaşlarımla konuşurken, bazı şirketlerin hala "Sınıflarla C" ile çalıştığını, "Modern C ++" ile çalışmadığını da belirttim. Belki de "Modern C ++" nın yazarları ve kullanıcıları tarafından önerilen kültür bir gün geçerli olacaktır :)


Çalıştığım yerde hala sınıflarda C kullanıyoruz, çünkü muhtemelen bir süredir orada olan birçok eski zamanlayıcı var. BOOST'u bırakın, STL'ye karşı bile çok temkinli görünüyorlar.
aneccodeal

12

Sanırım başlangıçta kötü bir deneyim yaşadın.

Kendinize Scott Meyers Etkili C ++ kitapları almalısınız . 1999'da öfkeyle C ++ kullanmaya başladım, ekip liderim HERHANGİ bir kodu kontrol etmeme izin verilmeden önce oturup Etkili C ++ ve Daha Etkili C ++ okumamı sağladı.

Onun tavsiyesi çoğu hatları üzerindedir "Bu kullanmayın özelliği , ancak Gerekirse, tutmak , bu akılda"

Tavsiyesine uyarsanız, iyi veya "Modern" C ++ yazarsınız.

Artık onun da STL üzerine bir kitabı var, ama ben okumadım.


Bunun sadece başlangıç ​​noktam olduğunu söylemeliyim. Bugün, STL, boost, RAII ve diğer her şeyden çok rahatım. İlk deneyimimin ne kadar yaygın olduğunu merak ettim.
jalf

9

C ++ işlerimde, modern özelliklerin giderek daha fazla kullanılacağını buldum ve daha fazla insan bana telefon gösterimleri ve röportajlarda sordu. Anladığım kadarıyla, anlıyorlar.

C ++ 'ı aslında Classes ile C gibi bir şey olarak öğrendim; dil bunun çok ötesine geçmiş olsa da okuduğum kitaplar ve birlikte çalıştığım insanlar "eski C ++" ya sıkı sıkıya bağlıydı. İnsanların otomatik olarak yapmaktan ziyade düşünecekleri bir şeyi RAII ve istisnai güvenlik sorunları hakkındaki bazı ilk makaleleri okuduğumu hatırlıyorum.

Belirtildiği gibi, artık yeni kitaplar var. Eskilerden birçoğu hala alakalı, ancak giderek kötü fikirlerin neden kötü olduğunu açıklamakla dolu görünüyorlar. (Benzer şekilde, modern okuyucular için Freud'un bilinçdışı bir zihin hakkındaki fikirlerinin ne kadar devrimci olduğunu anlamak zordur, çünkü artık geleneksel bir bilgeliktir.)

Stroustrup, Programlama: İlkeler ve C ++ Kullanarak Uygulama adlı bir ders kitabıyla çıktı . Satın aldım çünkü henüz Stroustrup'un kitabından iyi şeyler öğrenmeyi başaramadım, ancak ilk birkaç bölümü geçemedim. Şimdiye kadar söyleyebileceğim tek şey, onun başlama şeklini onayladığım ve en azından C ++ 'nın nasıl kullanılması gerektiğine dair iyi bir giriş.


STL'nin ilk sürümleri bile istisnai güvenli değildi.
Kragen Javier Sitaker

2
O zamanlar kimse istisnai korumalı kod yazmayı gerçekten bilmiyordu. Bu, standardın yayınlanmasını takip eden yıllarda gerçekleştirildi. C ++ Raporundaki bazı makaleleri hatırlıyorum.
David Thornley

7

Şu anda dahil olduğum proje üzerinde çalışırken, önemli bir süre içinde (şimdi 10 yıldan fazla) gelişen birçok C ++ kodu var. Bahsettiğiniz evrim burada açıkça görülebilir: eski kod genellikle "sınıflarla C" dir - ham işaretçiler, char*dizgiler ve ilişkili C işlevlerinin, dizilerin vb. Kullanımı; daha yeni kod, ATL akıllı işaretçileri ve benzerlerini kaynakları yönetmek için kullanır, ancak yine de çoğu zaman elle kodlanmış döngülere yapışır ve yineleyici nadir görülen bir manzaradır; ve en yenisi, STL kapsayıcıları, algoritmaları,shared_ptr(tutamaçları yönetmek için özel siliciler dahil), yoğun şekilde genelleştirilmiş işlev ve sınıf şablonları vb. El ile kullanım ömrü yönetimi ile ham, kapsüllenmemiş işaretçiler gibi geleneksel "C sınıflarıyla" kodlama tekniklerinin çoğu, bugünlerde kod incelemelerinde pek hoş karşılanmıyor. Buna göre, gözleminizin doğru olduğu görülüyor.

En son gelişme, C ++ 0x lambdas için bir moda gibi görünüyor - bu da dengeyi elle kodlanmış döngüler yerine standart algoritmalar kullanmak lehine çevirmesi açısından olumlu bir yanı var, çünkü artık tüm kodunuzu satır içi olarak alabilirsiniz. algoritmalar da.


6

Std :: vector'un bugünlerde "modern" olarak nitelendirildiğini söyleyemem. Gerçekten çok basit.

Genel olarak benim izlenimim, insanların modern C ++ stiliyle ilgili bir miktar deneyim kazandıkları ve biraz ayıldıkları yönünde. Basit bir örnek vermek gerekirse, STL for_each ilginçti ama pratikte düz bir C döngüsüne çok fazla değer katmıyor. Hata ayıklamak daha zordur ve bazen en iyi performansı sağlamaz. Ayrıca, mevcut STL'deki işlevsel programlama yapıları, özellikle ML gibi gerçek bir işlevsel dilden deneyim aldıysanız, genellikle çok zahmetlidir.


1
neden vektörün modern olarak nitelendirilmediğini söylüyorsunuz? Temel olmasına rağmen birçok kullanım durumu için hala en son teknolojidir. ama bence temel olan bir şeyin modern olmadığı anlamına gelmez. tam tersi, eğer varsa. ama sanırım ikinci paragrafınıza katılıyorum :)
Johannes Schaub - litb

4
ama sanırım bunun nedeni, bazı kişilerin for_each ve friends temelde her şey için, hatta basit bir for-loop'un çok daha kısa olacağı şeyler için bile - 2 satır döngüsünü 10 satıra kadar şişirmek için kullanmaya çalışmasıdır. i lambda olsa C ++ 1x satışa sunulacak zaman fazla insan for_each ve arkadaşları kullanmayı bekliyoruz
LITB - Johannes Schaub

7
vektörün temel olması tam olarak noktadır. Her zaman basit değildi. Bir zamanlar, genellikle süper karmaşık (ŞABLONLAR kullandı) ve verimsiz (ham dizi değil) bir şey olarak görülüyordu. Uzmanların vaaz edebileceği bir şey, ancak çoğu insan güvenmedi.
jalf

2
Belki std :: for_each, demek ... std :: transform ile karşılaştırıldığında nadiren ihtiyacınız olan şey olduğu için? Algoritmayı kullanmak, çok yaygın bir hatadan kurtulmanıza yardımcı olur: yanlış döngü koşulu.
Edouard A.

vektör <bool> kesinlikle temel değil ...
Kugel

6

Tecrübelerime göre (İspanyol Üniversitesi), maalesef kural, dilleri kendi içinde dikkate almamaktır. Programlamayı öğretmek için en kolay dilleri (yani Java) kullanırlar, çünkü bunun öğretmenler ve öğrenciler için kolay olması beklenir ve daha sonra işletim sistemi sınıfları ve benzeri için C kullanırlar.

C ++, sadece sınıflarla birlikte bir C sağlamak için çok az (herhangi bir oranda herhangi bir kursta) tanıtıldı. Takviye veya hatta STL'ye girmiyorlar. C ++ 'ın tüm özelliklerini ve düşünce biçimini takip etmenin hem öğretmenler hem de öğrenciler için maliyetli olduğunu düşünüyorum. Buradaki C ++ programcılarından kaçı, tüm Boost kitaplıklarını daha iyi bir çözüm sunmak veya tasarlamak için kullanacak kadar biliyor? Tüm yeni kitaplıklara ve deyimlere ayak uydurmakla ilgilenmek gerekir.

Ancak, dediğim gibi, genel olarak programlamanın (ve özellikle programlama dillerinin) çok ciddiye alınmadığı, çünkü bir işe başladıklarında geçici bir görev gibi göründüğü için, daha sonra ilerledikçe nasıl programlanacağını unutun. kurumsal ağaç. Buradaki birçok işletme ve Üniversitenin kendisi programlamanın herkes tarafından yapılabileceğini düşünüyor.

Bu felsefeyi izlerseniz, tanıdığım çoğu insan için C ++ her zaman "sınıflarla C" olacaktır.

Saygılarımızla,


Bunların çoğu Bilgisayar Bilimlerinde çok yaygındır ve genel olarak bunun kötü bir şey olduğunu düşünmüyorum. (Dile odaklanmamak, yani. Öğretilen dillerin hala doğru bir şekilde öğretilmesi gerekir).
jalf

+1: "(Dile odaklanmıyorum, yani. Öğretilen dillerin hala doğru bir şekilde öğretilmesi gerekiyor)"
Jared Updike

6

Benim deneyimlerime göre, büyük ölçüde yazılım ürününün / projesinin yaşına bağlıdır. Bildiğim çoğu yeni proje modern C ++ (RAII, STL, Boost) kullanıyor. Ancak, 10 yıldan daha eski birçok C ++ projesi var ve burada modern C ++ görmüyorsunuz.

Ayrıca, en popüler STL uygulamalarından bazılarının yaklaşık 5 yıl öncesine kadar (MSVC <7.0 ve GNU <3.00) hemen hemen bozuk olduğunu unutmayın.


4

Sanırım karşılaştığım en büyük engel, özellikle platformlar arası projelerde alet zinciri desteği. Birkaç yıl öncesine kadar, "x platformunun çalışabilmesi için STLport'a ihtiyacı var çünkü derleyicileri çalışıyor" yazan derleme notları görmek yaygındı. Şimdi bile, farklı BOOST sürümlerine bağlı birden çok üçüncü taraf bağımlılığı kullanmaya çalışan insanlarla ilgili sorunlar görüyorum. Bu, bağlantı oluşturmayı imkansız hale getirir, yani geri dönüp deponuzu sıfırdan yeniden oluşturmanız gerekir.

Artık neredeyse herkes MSVC ++ 6'yı kullanmayı bıraktığına göre, STLport karmaşası geride kaldı. Ancak TR1 kapıdan çıkar çıkmaz, "hangi ortamların hangi sürümlerinin onu desteklediğine ve doğru yaptığına" geri dönüyoruz ve bir kez daha bu benimsenmeyi yavaşlatacak.

1992'de C'de (C ++ değil) başlayan bir proje üzerinde çalışıyorum. Modern uygulamaları eski kod tabanına dağıtmak imkansız olurdu. Aynı şekilde, C ++ dilinin son teknolojisine çok daha yakın olan başka bir proje üzerinde çalışıyorum.


3

Bulunduğum ve duyduğum birçok takım büyük "istisnalar kullanıyor muyuz?" soru. Bu, "modern C ++ kullanıyor muyuz?"

İstisnaları kullanmadığınızda, dilin ve kütüphanelerinin tüm gücünü kullanmanız engellenir.

Ancak birçok eski kod tabanı istisnasızdır ve istisnaları, onları beklemeyen bir kod tabanına veya bunları nasıl kullanacağını bilmeyen bir takıma çekmek zor olarak algılanır, bu nedenle bu tür durumlarda cevap şudur: genellikle 'hayır.'

Tecrübelerime göre, modern C ++ takımda tutkulu olan, daha azını görmeye dayanamayan, onu zorlayacak birine ihtiyaç duyar. Aynı zamanda eski koda benzemesini isteyenlerin itirazlarının üstesinden gelmesi gerekiyor.

Eski C ++ kod tabanlarının çok hızlı bir şekilde ortadan kalktığını düşünmesem de, dünyada bu tutkulu insanların beş yıl öncesine göre daha fazla olduğuna inanıyorum. Beş yıl önce karşılaştıkları aynı yokuş yukarı savaşla yüzleşirler, ancak daha çok benzer ruhlar bulabilirler.


3

Böyle bir soruyu cevaplamadan önce, "Modern" in ne olduğu konusunda hemfikir olmalısınız. "Modern" kötü tanımlanmış bir kelime olduğundan ve farklı insanlar için farklı anlamlar ifade ettiğinden, bu muhtemelen gerçekleşmez. Alexandrescu'nun kitabının (Modern C ++ Tasarımı) başlığı da pek yardımcı olmuyor, çünkü büyük ölçüde Şablon Metaprogramlama üzerine bir kitap, C ++ 'nın belirli bir alanı ama hiçbir şekilde tek değil.

Benim için "Modern C ++"! = "Şablon Metaprogramlama". C ++ 'ın C'nin üstündeki özelliklerinin şu kategorilere gireceğini söyleyebilirim:

  • Sınıflar (Yapıcılar, Yıkıcılar, RAII, Dinamik Döküm ve RTTI)
  • İstisnalar
  • Referanslar
  • Standart kitaplıkta (STL) Veri Yapıları ve Algoritmalar
  • iostreams
  • Basit sınıf ve işlev şablonları
  • Şablon meta programlama

Bunların hiçbiri özellikle modern değil, çünkü hepsi yaklaşık 10 yıl veya daha uzun süredir. Bu özelliklerin çoğu kullanışlıdır ve birçok kullanım durumu için düz C'den daha üretken olmanızı sağlar. İyi bir programcı, hepsini uygun büyüklükte bir projede kullanmalıdır ve kullanacaktır, ancak bunlardan biri diğeri gibi değildir:

Şablon Metaprogramlama.

Şablon meta programlamasının kısa cevabı hayır demektir. Ne yazık ki bazı insanlar için kitaptan dolayı "Modern C ++ programlama" ile eş anlamlıdır, ancak sonunda çözdüğünden daha fazla sorun yaratır. C ++ yansıtma gibi daha iyi genel programlama mekanizmaları geliştirmediği sürece, genel programlama için uygun olmayacaktır ve Python gibi daha yüksek seviyeli diller bu kullanım durumları için daha uygun olacaktır. Bunun ve diğer birçok nedenden dolayı, C ++ FQA'ya bakın


6
IMHO şablonu metaprogramlama, uygulama programlaması için neredeyse hiç gerekli değildir , burada yalnızca okunabilirlik ve anlaşılması zor hatalar pahasına muhtemelen gereksiz genellik düzeyleri sağlamaya hizmet eder. Ancak OTOH, kütüphaneler oluştururken (a la Boost), eklenen genelliğin yararlı olduğu ve (çirkin, aldatıcı, kafa karıştırıcı) mekanizmaların görünmeden gizlenebildiği uzmanlar için son derece yararlıdır.
j_random_hacker

3
Haklısınız, şablon metaprogramlama, özellikle kütüphanelerde, ölçülü yapılırsa, zevkli bir şekilde kullanılabilir. Ama çoğu zaman insanların şablon metaprogramlama yolunda çok ileri gittiklerini ve bunun sonucunda da programlarının zarar gördüğünü gördüm. Metaprogramlamaya karşı değilim, aslında bunun güçlü bir savunucusuyum, sadece C ++ 'nın buna yönelik olanakları oldukça kaba.
Anton I. Sipos

2

C ++ öğrenmek için en iyi kitap. Koenig & Moo tarafından "Accelerated C ++", modern C ++ olarak tanımladığınız şeyi öğretir, bu yüzden bugünlerde çoğu insan bunu kullanıyor sanırım. Bir süredir C ++ kullanan bizler için (benim durumumda 80'lerin ortalarından beri), modern C ++ kendi dizilerimizi, dizilerimizi, karma tablolarımızı (tekrar tekrar) yazmanın sıkıcı görevlerinden büyük bir rahatlama sağlıyor.


1
Necro demek istemiyorum, ama kitabı bu tavsiyeye dayanarak satın aldım. Görmemiz gerekecek!
Andrew Weir

2

C ++ İşlerine gerçekten baktım ve "modern" kitaplıklar iş tanımlarında giderek daha fazla kullanılıyor, oldukça "eski tarz" bir c ++ kitaplığı olan MFC daha az kullanılıyor.


1

1990'ların sonlarında dilin standardizasyonu ilk adımdı, derleyici üreticilerinin "standart" özellikler setine odaklanmasına izin verdi ve aynı zamanda dilin, standardizasyon sürecinde ortaya çıkan bazı kaba kenarları düzeltmesine izin verdi.

Bu da, belirli bir derleyici uygulaması tarafından sağlanan özelliklere değil, dilin standart özelliklerine dayalı çerçevelerin geliştirilmesine izin verdi. Boost kitaplığı özellikle bu bağlamda. Ayrıca bu, yeni geliştirmenin önceki çalışmayı temel almasına ve böylece daha karmaşık sorunlara olası çözümler sunmasına izin verdi.

Burada dikkate değer bir değişiklik, daha önce çerçevelerin temel sınıflar ve türetilmiş sınıflar (bir çalışma zamanı özelliği) kavramına dayalı olmasıdır. Ancak artık en gelişmiş özellikler çoğunlukla "özyinelemeli" şablonlara (bir derleme zamanı özelliği) dayanmaktadır.

STL'nin artıları ve eksileri var, ancak işe yarayan ve basit olan bir şey istiyorsanız, zamanın testinden sağ çıktı. STL'nin başlamanıza yardımcı olacak bir şeyleri mutlaka vardır. Tekerleği yeniden icat etmenin bir anlamı yok (didaktik nedenler dışında).

Bilgisayar donanımı da 1990'lardan büyük sıçramalar yaptı, ardından bellek ve CPU artık derleyici için bir kısıtlama değil. Yani kitaplardan alınan teorik optimizasyonların çoğu artık mümkün.

Dilin sonraki adımları, 0x standart çabasının bir parçası olan çok çekirdekli programlama desteğidir.


1

Evet ve hayır. Kesinlikle yeni projeler için giderek daha popüler hale geliyor. Ancak, benimsemenin önünde hala başkalarının bahsetmediği politik değil pratik engeller var. Modern C ++ 'da görülen özellikleri düzgün şekilde desteklemeyen eski derleyicilerden ABI'leri kullanan birçok ticari C ++ kitaplığı vardır ve birçok şirket bu kitaplıklara güvenir. Örneğin Solaris'teki Sun Studio, STLport kullanmadan Boost ile çalışamaz, ancak kullanmak istediğiniz herhangi bir 3. parti ticari kitaplık Sun'ın STL sürümünü gerektirir. GCC 2.95 ve Redhat Enterprise Linux ile aynı hikaye.


-3

C ++ 'yı daha kararlı hale getirmek için ne kadar az çabanın harcandığı şaşırtıcı. Uyarı sistemi uygulanıyor, ancak pek gelişmiyor. Kendini ayağından vurmak 10 yıl öncesine göre daha kolay. Nedenini bilmiyorum ama c ++ hala en sevdiğim dil. :)


C ++ stabilizasyonu için harcanan "az çaba" ve "kendinizi bir ayağınızla vurmanın 10 yıl öncesine göre daha kolay olduğu" iddialarında bulunmadan önce bu başlıktaki kitaplardan birkaçını okumanızı öneririm.
Patrick Niedzielski

Elbette, std kitaplığı, bellek ayırma ve dize işleme üzerinde biraz kararlılık sağlar. Ne yazık ki dahili olarak o kadar tuhaf kodlama kuralları kullanıyor ki, uzaylılar tarafından yazıldığını düşünebilirsiniz. :)
AareP

2
Standart kitaplık bir belirtim olduğundan, derleyici satıcınızı garip dahili kodlama kurallarını kullandığı için suçlayın. Ve ayrıca, garip kodlama kuralları = / = istikrarsız veya kendinizi ayağınızdan vurmak daha kolay. Bu kodlama kurallarının çoğu (en azından MSVC kitaplığı hakkında ve muhtemelen diğerleri hakkında konuşarak) size hiçbir şekilde müdahale etmeyecek şekilde tasarlanmıştır, böylece aptalca şeyler yapabilirsiniz ve kütüphanenin umursamasına gerek kalmaz. C ++ spesifikasyonunun dışında kodlarsanız, bu farklı bir şeydir.
Patrick Niedzielski

Tipik bir STL uygulamasının (özellikle belirli bir derleyici ile paketlenmişse) kendisini uygulamak için Standart C ++ kullanmak zorunda olmadığına dikkat edin . Kodunuza Standart tarafından vaat edilen garantileri sağlamak için kendi içindeki uygulamaya özgü bilgiyi çok iyi kullanabilir. Bununla birlikte, kendi kodunuz yalnızca Standardın garanti ettiği şeye bağlı kalmalıdır. Sen olamaz , belirli bir C ++ veya STL uygulamasını inceleyerek Standart garantileri öğrenirler.
Tanz87

Bu cevap on yıl önce yazılmıştır. O zamanlar, c ++ 'ı daha kararlı hale getirmek için ne kadar çaba harcanması şaşırtıcıydı . Bu, c ++ 0x'in c ++ 11 olarak piyasaya sürülmesinin bu kadar uzun sürmesinin temel nedenlerinden biriydi.
David Hammen
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.