it-swarm.dev

C ve C ++ arasındaki temel farklar nelerdir?

Birçoğu sanki aynı şeymiş gibi "C/C++" yazma eğilimindedir. Birçok benzerliği paylaşsalar da, açıkça aynı değiller.

Ancak C ve C++ arasındaki temel farklar nelerdir? C++ C'nin gelişmiş bir sürümü mü, yoksa C++ 'da olmayan özellikler var mı?

41
gablin

Aşağıdaki noktalar C++ ile ilgilidir:

  1. (kullanıcı tanımlı) statik tip sistemi: verileriniz ve kullanımları hakkında statik kontrollere izin verir - C'de kolayca yapılan birçok hatayı gösterir.
  2. çoklu- "paradigma":, C'deki gibi, nesne yönelimli paradigmalarla, genel paradigmalarla vb.
  3. Yapıcı/Yıkıcı: bir şey oluştururken veya yok ederken ne yapılacağını bir kez söylemenin ve kullanıcının doğru işlevi bulması ve C'deki gibi kullanması gerekmediğinden emin olmanın tek yolu.
  4. RAII (kötü adlandırılmış): belleği her zaman yönetmek zorunda değilsiniz. İşleri kapsam içinde tutun ve nesnelerinizin ömrünü açıklayan akıllı işaretçiler kullanın. Hala ham işaretçiler kullanabilirsiniz.
  5. Şablonlar: makrodan daha iyi, son derlemeden önce türleri işlemek ve oluşturmak için gerçek bir dil. Yalnızca bir tür sistemi yoktur (bkz. Gelecekteki C++ standartlarındaki kavramlar).
  6. Operatör aşırı yükleri: işlemleri basit bir sözdizimsel olarak açıklamanıza ve hatta C++ kodunuzda gömülü alana özgü dilleri tanımlamanıza olanak tanır.
  7. Kapsamlı adlar: ad alanları, sınıflar/yapı, işlevler vb. Adların çakışmamasını sağlamak için basit kurallara sahiptir.
  8. İstisna sistemi: genellikle dönüş kodundan daha iyi olan hataları yaymanın bir yolu. Aslında, uygulama tarafından yönetilmesi gerektiğinden, dönüş kodu etki alanına özgü mantıksal hatalar için iyidir. İstisnalar "zor" hatalar için kullanılır, aşağıdaki kodu yanlış yapan şeyler. Mümkünse, çağrı yığınında daha yüksek hataların yakalanmasına izin verir, bu istisnaya (günlüğe kaydederek veya durumu düzelterek) tepki verir ve RAII ile, eğer iyi kullanılırsa, tüm programı yanlış yapmaz - iyi yapılırsa tekrar.
  9. Standart Kütüphane: C kendine ait, ama hepsi "dinamik". C++ standart kütüphanesi (sadece kullandığınız için kod oluşturmaya izin veren şablonlardan (kapsayıcılar ve algoritmalar) yapılmış (= IO akış) değil. Daha iyi: derleyici kod üretmek zorunda olduğu için bağlam hakkında çok şey biliyor ve kodlayıcının kodunu gizlemesini gerektirmeden şablonlar ve diğer şeyler sayesinde çok fazla optimizasyon uygulayacak.
  10. const-correctness: Değişkenleri değiştirmediğinizden emin olmanın en iyi yolu. Değişkenlere salt okunur erişim belirtmeye izin verir. Ve sadece derleme zamanında kontrol edilir, böylece çalışma zamanı maliyeti yoktur.
43
Klaim

C++, C'nin başaramadığı karmaşıklığı yönetmek için icat edildi. Örneğin, C ile ilgili yaygın bir sorun, "değişkenler için adların tükenmesi" (kelimenin tam anlamıyla alınmaması gereken) olabilir çünkü kapsülleme, ad alanları vb. Yoktu.

Ayrıca, C'nin istisnaları yoktur, bu nedenle hata işleme çok hataya açıktır, çünkü kütüphane kullanıcısına her zaman işlevlerin dönüş değerlerini kontrol etmesine bağlıdır, oysa istisnalar dışında kütüphane geliştiricisi program akışının durduğunu garanti eden bir istisna atar.

C++, derleyicinin otomatik olarak çağırdığı nesneleri init yapıcıya yerleştirerek yardımcı olur. Programcı tarafından başlatılması gereken C yapılarının aksine (dolayısıyla başka bir hataya açık alan).

Son olarak, nesne yeniden kullanımı ve kaynak kodunu yeniden kullanmanıza izin veren şablonlar ve jenerikler gibi genel programlama tabanlı kavramlar gibi OOP tarafından atıfta bulunulan birçok başka avantaj vardır.

31
Jas

Genel olarak, C'de bulunan her şey C++ ile desteklenir. Açıkçası tam tersi kesinlikle yanlıştır.

Basitçe söylemek gerekirse, C++ nesne yönelimlidir (örneğin, sınıflarınız vardır), C değildir.

C++, boyanmış bir C89 tipine sahiptir.

Farklı diller. Sadece söz diziminin çoğunu paylaşıyorlar.

15

C99, C++ 'da bulunmayan (en azından tam olarak aynı biçimde) birkaç özelliğe sahiptir (örneğin, esnek dizi üyeleri, değişken uzunluk dizileri vb.)

C99 ayrıca kütüphaneye C++ 98/03 standardında bulunmayan çok şey ekledi; bunların çoğu C++ 11'e eklendi.

Temel yönelim açısından, C temel olarak yapılandırılmış prosedürel programlamayı destekler. C++, nesne yönelimli programlama, genel programlama ve metaprogramlamayı (derleme zamanında rasgele hesaplama) destekler. C++ 11 ile, en azından fonksiyonel programlama desteği ile karıştırılabilecek birkaç bit ve parça ekler (örn. Lambda ifadeleri). C++ 14 birkaç tane daha ekledi, ancak çoğu yönelimdeki herhangi bir büyük değişiklikten ziyade gerçekten daha kolay.

8
Jerry Coffin

Şahsen, şablonların C++ 'ın C'ye eklediği en önemli özellik olduğunu düşünüyorum.

1
zvrba