C ve C ++ arasındaki temel farklar nelerdir? [kapalı]


41

Birçok kişi sanki aynı şeylermiş gibi "C / C ++" yazma eğilimindedir. Birçok benzerliği paylaşsalar da, kesinlikle aynı değillerdir.

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


2
C ++ 'ın C süper
kullanıcısı

1
C ++ geliştirilmiş değil ... C.'nin bir süper ..
Joe DF

2
@JoeDF En başındaydı ama aslında "C ile uyumlu" şu anda aynı anlama gelmiyor. C ++ 'da C kodunu girmezsiniz ve standart C'nin tümü standart C ++ ile uyumlu değildir.
Klaim

+1 Haklısın, artık kardeş veya kuzen var. Eğer ne demek istediğimi anlıyorsan.
Joe DF,

Yanıtlar:


43

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

  1. (kullanıcı tanımlı) statik tip sistem: verileriniz ve kullanımları hakkında statik kontroller sağlar - C’de kolayca yapılan birçok hatayı gösterir.
  2. multi- "paradigma": C gibi, nesne yönelimli paradigmalar, genel paradigmalar vb.
  3. Yapıcı / Yıkıcı: Bir şeyi yaratırken veya yok ederken ne yapacağını bir kez söylemenin ve kullanıcının doğru işlevi bulmak ve C'deki gibi kullanmak zorunda kalmayacağından emin olmanın tek yolu
  4. RAII (kötü adlandırılmış): her zaman belleği yönetmeniz gerekmez. İşleri kapsamda 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 üretmek için gerçek bir dil. Sadece tip bir sistemden yoksundur (bkz. Gelecekteki C ++ standartlarındaki kavramlar).
  6. Operatör aşırı yüklemeleri: işlemleri basit bir sözdizimsel şekilde tanımlamanıza ve hatta C ++ kodunuzdaki gömülü alana özgü dilleri tanımlamanıza izin verir.
  7. Kapsamlı adlar: ad alanları, sınıflar / yapı, işlevler vb. Adların çakışmadığından emin olmak için basit kurallara sahiptir.
  8. İstisna sistemi: Genellikle dönüş kodundan daha iyi olan hataları yaymanın bir yoludur. Aslında, uygulama kodu yönetmek zorunda olduğundan, 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 sadece yanlış yapan şeylerdir. Mümkünse çağrı yığında daha yüksek hataların yakalanmasına izin verir, bu istisnalara (günlüğe kaydetme veya durumu düzelterek) ve RAII ile iyi kullanılırsa, tüm programı yanlış yapmaz - eğer iyi yapılırsa, tekrar yapar.
  9. Standart Kütüphane: C kendine ait, fakat hepsi "dinamik". C ++ standart kütüphanesi neredeyse yalnızca (IO akışları değil) yalnızca kullandıklarınız için kod üretilmesine izin veren şablonlardan (kaplar ve algoritmalar) oluşur. Daha iyi: derleyicinin kod üretmesi gerektiğinden, içerik hakkında çok şey bilecek ve şablonların ve diğer şeylerin sayesinde kodlayıcı kodunu gizlemesine gerek kalmadan hapishaneye birçok optimizasyon uygulayacaktır.
  10. const-doğruluğu: Yapmamanız gereken değişkenleri değiştirmediğinizden emin olmanın en iyi yolu. Değişkenlere salt okunur erişim belirtilmesine izin verir. Ve sadece derleme zamanında kontrol edilir, böylece çalışma zamanı maliyeti yoktur.

31

C ++, C'nin idare edemediği 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" (tam anlamıyla elbette alınmaması) olabilirdi çü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ının her zaman işlevlerin dönüş değerlerini kontrol etmesine bağlıdır, ancak istisnalar dışında, kütüphane geliştiricisi program akışının durmasını garanti eden bir istisna atar.

C ++, yapıcının otomatik olarak derleyici tarafından çağrılan nesneleri başlatmasını sağlayarak yardımcı olur. Programcı tarafından başlatılması gereken C yapılarının aksine (bu nedenle başka bir hataya açık alan).

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

Ve burada listelemek için zamanımın çoğunu alacak başka şeyler de var.


C ++ yapıcı C yapıları hakkında yazmak ve hata eğilimli olduğunu seviyorum. Buna katılıyorum. Ancak, bunu her zaman boş bir kurucu kullanan ve ardından ayarlayıcılarla üye alanlarını ayarlayan JavaBeans'da kullanmanın Java yöntemini sevmiyorum. Benim bakış açıma göre, bu C yapıları kadar hataya açık. Java Nesnelerimi yalnızca yapıcı ile ayarlamayı tercih ederim. Bu konuda StackOverflow hakkındaki soruma bakın .
Jonas

Orada bir noktaya değindin, ama cevabımın odağı C ile C ++ arasındaydı.
Jas

1
Oh, hadi, C ile OOP kullanmanızı kim önlüyor? Nesneleri yeniden kullanabilir ve istisnalar dahil olmak üzere her şeyi yapabilirsiniz. C de OOP programlama adı verilen bir kitap bile var

2
@Vlad, bahsettiğiniz hiçbiri 25 yıl önce bir seçenekti.
Jas

4
Kullanımda olan hemen hemen her programlama dilinde OOP yapabilirsiniz, ancak bu dilin bunun için tasarlandığı anlamına gelmez. Mesela Lua'yı ele alalım. Teknik olarak OOP'a izin vermesine rağmen, bunu yapmanın yaklaşık elli farklı yolu var, çok fazla baş ağrısının bir nedeni.
tyjkenn

15

Genel olarak, C de var olan her şey C ++ 'da desteklenir. Açıkçası tam tersi yanlıştır.

Basitçe söylemek gerekirse, C ++ nesne yönelimlidir (bu nedenle, örnekler için sınıfınız vardır), C değildir.

C ++, C89'da bulunmayan bir boolean tipine sahiptir.

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


4
C99 (adında bir Boole türüne sahip _Boololan, boolbir takma ad gibi).
Jerry Coffin

1
Bu kesinlikle doğru değil. Örneğin, C99, long longISO C ++ 'nın (henüz) parçası olmayan veri türüne sahiptir.
Chinmay Kanchi

11
Err ... C ++ yalnızca Nesne yönelimli değil: C ++ ile nesne yönelimli paradigmalar kullanabilirsiniz, çünkü dil bunun için özellikler sağlar, ancak diğer paradigmalar için de özellikler sağlar. Bundan bahsetmelisin, gerçekten önemli, her şeyi değiştirir.
Olmasaydı

4
C ++ 'da çalışmayan birçok yapı var.

1
@klez: evet - ama yine de yanlış. ANSI başlangıçta C89'u (Boole türüne sahip olmayan) geliştirmiş olsa da, yeni geliştirme şimdi ISO tarafından yapıldı ve ANSI, ISO standardını kabul ettiğinden, mevcut ANSI C standardı, mevcut ISO C standardıyla aynıdır ( bir Boolean tipi).
Jerry Coffin

8

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

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

Temel yönelim açısından, C temel olarak yapısal prosedürel programlamayı destekler. C ++, nesne yönelimli programlama, genel programlama ve metaprogramlamanın yanı sıra (derleme zamanında rasgele hesaplamanın yapılması) bunu destekler. C ++ 11 ile, fonksiyonel programlama desteği için de en azından karıştırılabilecek birkaç parça ve parça ekler (örneğin, lamda ifadeleri). C ++ 14 birkaç tane daha ekledi, ancak çoğu yönelimdeki büyük değişikliklerden ziyade gerçekten daha kolay.


1

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


1
Miras sınıfları nasıl? Bu, C’de gerçekten zor bir iştir, oysa ki bir çok Şablon önişlemci Makroları ile yapılabilir.
JBRWilkinson

4
Önişlemci makroları tip güvenli değildir; hata ayıklamayı da zorlaştıran saf metinsel ikamedir. Çalışmak için temel sınıflar ve miras almak, C + 'da pek fazla iş değildir. Örneğin, bu makaleye bakın: arxiv.org/abs/1003.2547
zvrba

2
Benim oyum, C ++ 'ın C üzerindeki en önemli özelliği için yıkıcı olacak (şaşırtıcı temizlik yeteneklerinden dolayı bile inşaatçılar).
Thomas Eding,

@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (tip) güvenli aşırı yükleme / C şablonları. Thomas ile yıkıcıların çok daha önemli bir özelliğin eksik olduğuna katılıyorum. Ancak yıkıcılar çoğu zaman önemli kodları gizler. İsim alanları (kapsamı) bence en önemlisi.
YoYoYonnY
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.