Başlamak için, her zaman bir dilde diğerinden daha iyi çözülen bazı sorunlar olacaktır. Bazı "iyi" tanımları için, belirli sorunları "diğer" dillerden "daha iyi" çözen diller her zaman olacaktır. Bununla birlikte, çok çok sayıda sorunun çok benzer ihtiyaçları vardır (bazı giriş / çıkışlar, bazı hesaplamalar) ve benzer gereksinimlerle (makul güvenilirlik, makul performans) karşı karşıya kalırlar.
Zaten C'yi bildiğiniz gibi, oradaki sorunların büyük çoğunluğu için, C ++ 'ın önemli bir dezavantajı ve bir dizi önemli iyileştirme sağlamadığını belirtiyorum. Kalın? Bazı insanlar öyle düşünüyor, ama gerçekten durum bu. Birkaç yaygın C ++ yanlış anlaşılmalarını temizleyerek başlayalım:
C ++ C'den daha yavaştır. Yanlış! Birçok C programı da geçerli C ++ programlarıdır - ve böyle bir C programının C derleyicisi veya C ++ derleyicisi ile derlendiğinde aynı hızda çalışması gerekir.
C ++ 'a özgü özellikler ek yük gerektirir. Yanlış! Bazı C ++ 'a özgü özelliklerin (sanal işlev çağrıları veya istisnalar gibi) getirdiği ek yükü, C de benzer bir özellik uygularsanız, kendiniz ekleyeceğiniz ek yük ile karşılaştırılabilir.
C ++ nesne yönelimlidir. Yanlış! C ++ dili, nesneye yönelik programlama ve genel programlamayı kolaylaştıran bazı dil uzantıları içerir. C ++, nesne yönelimli tasarımı herhangi bir yere zorlamaz - yalnızca izin verir. C, nesne yönelimli programlamaya da izin verir, C ++ onu daha basit ve daha az hataya açık hale getirir.
Bu yüzden, eğer bana inanıyorsanız, "C ++ 'ın C'den önemli ölçüde daha kötü olmadığını" tespit ettik. C ++ 'ı daha iyi C yapan şeylere bir göz atalım:
Daha güçlü yazma C ++ 'daki tip sistemi, C' den daha kuvvetlidir. Bu, birçok yaygın programlama hatasını önler - bir sonraki çok önemli özellik ile birlikte, daha güçlü olan tip sistemi bile rahatsızlık vermemeyi başarır.
Parametreli türler template anahtar kelimesi programcının algoritmaların jenerik (tip-agnostik) uygulamaları yazmasına izin verir. C'nin nerede olduğu gibi bir element ile genel bir liste uygulaması yazılabilir:
struct element_t {
struct element_t *next, *prev;
void *element;
};
C ++ birinin şöyle bir şey yazmasına izin verir:
template <typename T>
struct element_t {
element_t<T> *next, *prev;
T element;
};
C ++ uygulaması sadece genel programcı hatalarını engellemekle kalmaz (listede yanlış tipte bir eleman koymak gibi), aynı zamanda derleyici tarafından daha iyi optimizasyon sağlar! Örneğin, genel bir sıralama uygulaması hem C hem de C ++ ile kullanılabilir -
C rutini şöyle tanımlanır:
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
C ++ rutini;
template void sort(RandomAccessIterator first, RandomAccessIterator last);
Fark, örneğin bir tamsayı dizisini sıralamanın, C durumunda, her bir karşılaştırma için bir işlev çağrısı gerektirmesidir; oysa C ++ uygulaması, derleyicinin, tam sıralama karşılaştırma çağrıları satır içi sıralamasını sağlar; derleyici tarafından derleme sırasında otomatik olarak başlatılır, şablon argümanlarına doğru türler eklenir.
- Daha büyük bir standart kütüphane C ++, C standart kütüphanenin tam olarak kullanılmasını sağlar. Elbette, C standart kütüphanesi gerçek dünya programları yazarken paha biçilmez bir kaynak olduğu için çok önemlidir. Bununla birlikte, C ++, Standart Şablon Kütüphanesini içerir. STL, yukarıdaki sıralama rutini gibi bir dizi kullanışlı şablon içerir. Listeler, haritalar, kümeler, vb. Gibi faydalı ortak veri yapılarını içerir. Sıralama rutini gibi, diğer STL rutinleri ve veri yapıları, programcının sahip olduğu özel ihtiyaçlara göre "uyarlanır" - tüm programcının yapması gereken, türleri.
Elbette, STL gümüş mermi değildir - ancak genel problemleri çözerken çok sık yardımcı olur. C listesini ne sıklıkla uyguladınız? Bir RB-ağacı ne kadar sıklıkla daha iyi bir çözüm olurdu, ancak bunu yapacak vaktiniz olsaydı? STL ile bu gibi tavizler vermenize gerek yok - ağacı daha uygunsa kullanın, listeyi kullanmak kadar kolay.
Tamam, sadece iyi kısımları tartışıyordum. Herhangi bir olumsuz tarafı var mı? Tabii ki var. Ancak sayıları günden güne azalıyor. Açıklamama izin ver:
İyi bir C ++ derleyicisi yok Uzun zamandır böyle. Ancak, dilin 1998'de standartlaştırıldığını - C'den daha karmaşık, karmaşık bir dil olduğunu, derleyicilerin standarda uymasının uzun zaman aldığını hatırlamalısınız. Ancak bu yazı itibariyle, orada en çok kullanılan platformlar için mevcut iyi derleyiciler var; 3.X versiyonlarındaki GCC genellikle çok iyidir ve GNU / Linux ve çoğu UNIX platformunda çalışır. Intel, Win32 için iyi bir derleyiciye sahip - aynı zamanda oldukça iyi, ama ne yazık ki hala alt-par olan MS STL'ye güveniyor.
İnsanlar iyi bilmez C ++ Bu sıkça duyulan bir şikayet değil, ama çokça gördüğüm bir şey. C ++ büyük ve karmaşık bir dildir - ama aynı zamanda "OOP açlığı çözer, AIDS ve kanseri tedavi eder" günlerinde çok fazla sinirlendirilen bir dildi. Sonuç, burada ve orada birkaç sınıf bildirimi olan temelde kötü C olan birçok gerçekten kötü C ++ kodunun var olduğu ve öğrenme materyali olarak kullanılmakta olduğu görülüyor. Bu, C ++ 'ı tanıdığına inanan pek çok insan gerçekten çok berbat bir kod yazdığı anlamına gelir. Bu çok kötü ve bu bir problem, ama bunu C ++ 'da suçlamanın haksızlık olduğunu düşünüyorum.
Yani, C ++ ile ilgili iki büyük sorun, C ++ 'nın genç bir dil olmasının sonucudur. Zamanla yok olurlar. Ve buradaki çoğu sorun için, eğer iyi programcılar elde edebilirseniz (ya da iyi C ++ 'ı öğreniyorsanız), bugün sorun değil.