Apa perbedaan mendasar antara C dan C ++? [Tutup]

41

Banyak yang cenderung menulis "C / C ++", seolah-olah mereka adalah hal yang sama. Meskipun mereka memiliki banyak kesamaan, mereka jelas tidak sama.

Tapi apa sebenarnya perbedaan mendasar antara C dan C ++? Apakah C ++ merupakan versi C yang disempurnakan, atau adakah fitur dalam C yang tidak ada di C ++?

Gablin
sumber
2
Saya pikir C ++ adalah yang super set C
pengguna
1
C ++ tidak ditingkatkan ... ini adalah superset dari C ..
Joe DF
2
@ JoDF Itu pada awalnya tetapi sebenarnya "kompatibel dengan C" sekarang yang tidak berarti sama sekali. Anda tidak kode C dalam C ++ dan tidak semua standar C kompatibel dengan standar C ++.
Klaim
+1 Anda benar, sekarang ada seperti saudara atau sepupu. Jika kamu tahu maksud saya.
Joe DF

Jawaban:

43

Poin-poin berikut berhubungan dengan C ++:

  1. Sistem tipe statis (ditentukan pengguna): memungkinkan pemeriksaan statis tentang data Anda dan penggunaannya - menunjukkan banyak kesalahan yang mudah dilakukan dalam C.
  2. multi-"paradigma": memungkinkan bekerja seperti di C, dengan paradigma berorientasi objek, dengan paradigma generik dll.
  3. Konstruktor / Destruktor: satu-satunya cara untuk mengatakan sekali apa yang harus dilakukan ketika membuat atau menghancurkan sesuatu dan pastikan pengguna tidak harus menemukan fungsi yang tepat dan menggunakannya seperti di C.
  4. RAII (nama buruk): Anda tidak harus selalu mengelola memori. Simpan saja berbagai hal dalam ruang lingkup dan gunakan pointer pintar yang menggambarkan objek Anda seumur hidup. Masih bisa menggunakan pointer mentah.
  5. Template: lebih baik daripada makro, bahasa nyata untuk memanipulasi dan menghasilkan jenis sebelum kompilasi akhir. Hanya tidak memiliki sistem tipe (lihat Konsep dalam standar C ++ di masa depan).
  6. Kelebihan operator: memungkinkan untuk mendeskripsikan operasi dengan cara sintaksis sederhana dan bahkan untuk mendefinisikan bahasa khusus domain tertanam di dalam kode C ++ Anda.
  7. Nama lingkup: ruang nama, kelas / struct, fungsi, dll. Memiliki aturan sederhana untuk memastikan nama tidak berbenturan.
  8. Sistem pengecualian: cara untuk menyebarkan kesalahan yang seringkali lebih baik daripada mengembalikan kode. Bahkan, kode pengembalian baik untuk kesalahan logis khusus domain, karena aplikasi harus mengelolanya. Pengecualian digunakan untuk kesalahan "sulit", hal-hal yang membuat kode berikut salah. Hal ini memungkinkan untuk menangkap kesalahan yang lebih tinggi di tumpukan panggilan jika memungkinkan, bereaksi terhadap pengecualian tersebut (dengan masuk atau memperbaiki keadaan) dan dengan RAII, jika digunakan dengan baik, itu tidak membuat keseluruhan program salah - jika dilakukan dengan baik, lagi.
  9. Perpustakaan Standar: C memiliki sendiri, tetapi semuanya "dinamis". Pustaka standar C ++ hampir (bukan aliran IO) terbuat dari templat (wadah dan algoritme) yang memungkinkan pembuatan kode hanya untuk apa yang Anda gunakan. Lebih baik: karena kompiler harus membuat kode, ia akan tahu banyak tentang konteksnya dan akan dengan senang hati menerapkan banyak optimasi tanpa harus mengharuskan pembuat kode mengaburkan kodenya - terima kasih untuk templat dan hal-hal lain.
  10. const-correctness: Cara terbaik untuk memastikan Anda tidak mengubah variabel yang tidak seharusnya. Memungkinkan menentukan akses baca-saja ke varaibles. Dan itu hanya diperiksa pada waktu kompilasi sehingga tidak ada biaya runtime.
Klaim
sumber
31

C ++ diciptakan untuk mengelola kompleksitas yang tidak bisa ditangani oleh C. Sebagai contoh, masalah umum dengan C adalah bahwa Anda dapat "kehabisan nama untuk variabel" (tidak harus diambil secara harfiah tentu saja) karena tidak ada enkapsulasi, ruang nama dll.

Juga, C tidak memiliki pengecualian, oleh karena itu penanganan kesalahan sangat rawan kesalahan, karena tergantung pada pengguna perpustakaan untuk selalu memeriksa nilai kembali dari funcs, sedangkan dengan pengecualian, pengembang perpustakaan hanya melempar pengecualian yang menjamin aliran program akan dihentikan.

C ++ membantu dengan memiliki objek init konstruktor yang secara otomatis dipanggil oleh kompiler. Tidak seperti C struct yang perlu diinisialisasi oleh programmer (maka daerah rawan kesalahan lain).

Terakhir, ada banyak keuntungan lain yang dipuji oleh OOP, seperti penggunaan kembali objek serta konsep berbasis pemrograman generik, seperti template dan generik yang memungkinkan Anda untuk menggunakan kembali kode sumber, dll.

Dan banyak hal lain yang akan mengambil terlalu banyak waktu saya untuk dicantumkan di sini.

Jas
sumber
Saya suka bahwa Anda menulis tentang C ++ constructor vs C struct, dan itu rawan kesalahan. Saya setuju dengan itu. Tapi saya tidak suka cara Java menggunakan ini di JavaBeans, yang selalu menggunakan konstruktor kosong dan kemudian mengatur bidang anggota dengan setter. Dalam pandangan saya, itu rawan kesalahan seperti struct C. Saya lebih suka mengatur Obyek Java saya hanya dengan konstruktor. Lihat pertanyaan saya di StackOverflow tentang ini.
Jonas
Anda ada benarnya, tetapi fokus jawaban saya di sini adalah C vs C ++.
Jas
1
Oh, ayolah, siapa yang mencegah Anda menggunakan OOP dengan C? Anda dapat menggunakan kembali objek dan melakukan apa saja, bahkan pengecualian. Bahkan ada buku tentang itu, yang disebut pemrograman OOP dalam C.
2
@Vlad, tidak ada yang Anda bicarakan tentang opsi 25 tahun yang lalu.
Jas
4
Anda BISA melakukan OOP di hampir setiap bahasa pemrograman yang masih digunakan, tetapi itu tidak berarti bahasa itu dirancang untuk itu. Ambil Lua misalnya. Meskipun secara teknis memungkinkan OOP, tampaknya ada sekitar lima puluh cara berbeda untuk melakukannya, penyebab banyak sakit kepala.
tyjkenn
15

Secara umum, semua yang ada di C didukung di C ++. Jelas sebaliknya benar-benar salah.

Secara sederhana, C ++ berorientasi objek (jadi, misalnya, Anda memiliki kelas), C tidak.

C ++ memiliki tipe boolean yang tidak dimiliki C89.

Mereka adalah bahasa yang berbeda. Mereka hanya membagikan sebagian besar sintaksis.

Federico klez Culloca
sumber
4
C99 memiliki tipe Boolean (dinamai _Bool, dengan boolsebagai alias).
Jerry Coffin
1
Ini tidak sepenuhnya benar. Sebagai contoh, C99 memiliki long longtipe data yang bukan (belum) bagian dari ISO C ++.
Chinmay Kanchi
11
Err ... C ++ tidak hanya berorientasi objek: Anda dapat menggunakan paradigma berorientasi objek dengan C ++ karena bahasa menyediakan fitur untuk itu, tetapi juga menyediakan fitur untuk paradigma lain. Anda harus menyebutkan bahwa, itu sangat penting, itu mengubah segalanya. Jika tidak, kita semua harus beralih ke java ...
Klaim
4
Ada banyak konstruksi di C yang tidak berfungsi di C ++.
1
@lez: ya - tapi itu masih salah. Sementara ANSI awalnya mengembangkan C89 (yang tidak memiliki tipe Boolean), pengembangan baru sekarang dilakukan oleh ISO, dan ANSI menerima standar ISO, sehingga standar ANSI C saat ini identik dengan standar ISO C saat ini (yang memang memiliki tipe Boolean).
Jerry Coffin
8

C99 memiliki beberapa fitur yang tidak ada (setidaknya dalam bentuk yang persis sama) di C ++ (misalnya, anggota array fleksibel, array panjang variabel, dll.)

C99 juga menambahkan banyak ke perpustakaan yang tidak ada dalam standar C ++ 98/03; sebagian besar dari ini telah ditambahkan ke C ++ 11.

Dalam hal orientasi dasar, C pada dasarnya mendukung pemrograman prosedural terstruktur. C ++ mendukung hal itu serta pemrograman berorientasi objek, pemrograman generik, dan metaprogramming (melakukan perhitungan acak pada waktu kompilasi). Dengan C ++ 11, ia menambahkan beberapa bit dan potongan-potongan yang setidaknya bisa dikira sebagai dukungan pemrograman fungsional juga (misalnya, ekspresi lambda). C ++ 14 telah menambahkan beberapa lagi, tetapi kebanyakan dari mereka benar-benar lebih nyaman daripada segala macam perubahan besar dalam orientasi.

Jerry Coffin
sumber
1

Secara pribadi, saya pikir templat adalah fitur paling signifikan yang ditambahkan C ++ ke C.

zvrba
sumber
1
Eh, bagaimana dengan kelas dengan warisan? Itu benar-benar kerja keras di C, sedangkan banyak Template dapat dilakukan dengan macro preprocessor.
JBRWilkinson
4
Makro preprosesor bukan tipe aman; itu substitusi teks murni, yang juga membuat proses debug lebih sulit. Untuk mendapatkan kelas dasar dan pewarisan untuk bekerja tidak banyak pekerjaan di C. + Anda bisa membuat model metaobject Anda sendiri alih-alih terjebak dengan apa pun yang dipilih perancang bahasa untuk Anda. Lihat, misalnya, makalah ini: arxiv.org/abs/1003.2547
zvrba
2
Pilihan saya akan menjadi destruktor untuk fitur paling signifikan yang dimiliki C ++ melebihi C (bahkan lebih dari konstruktor karena kemampuan pembersihannya yang luar biasa).
Thomas Eding
@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (type) safe overloading / templates di C. Saya setuju dengan Thomas bahwa destruktor adalah fitur yang jauh lebih penting yang tidak ada. Tetapi destruktor sering menyembunyikan kode penting. Ruang nama (ruang lingkup) menurut saya yang paling penting.
YoYoYonnY