it-swarm-id.com

Apa perbedaan mendasar antara C dan C ++?

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++?

41
gablin

Poin-poin berikut berhubungan dengan C++:

  1. (ditentukan pengguna) sistem tipe statis: 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. Constructor/Destructor: 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 dalam 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. Templat: 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: namespaces, 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 seperti itu (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 IO stream) terbuat dari templat (wadah dan algoritme) yang memungkinkan menghasilkan kode hanya untuk apa yang Anda gunakan. Lebih baik: karena kompiler harus membuat kode, ia akan tahu banyak tentang konteksnya dan dengan senang hati akan menerapkan banyak optimisasi tanpa harus mengharuskan pembuat kode untuk mengaburkan kodenya - terima kasih untuk templat dan hal-hal lain.
  10. const-correctness: Cara terbaik untuk memastikan Anda tidak mengubah variabel yang seharusnya tidak Anda lakukan. Memungkinkan menentukan akses baca-saja ke varaibles. Dan itu hanya diperiksa pada waktu kompilasi sehingga tidak ada biaya runtime.
43
Klaim

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 fungsi, 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 templat dan generik yang memungkinkan Anda untuk menggunakan kembali kode sumber, dll.

31
Jas

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.

15

C99 memiliki beberapa fitur yang tidak ada (setidaknya dalam bentuk yang persis sama) di C++ (mis., 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 tersebut 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 (mis., Ekspresi lambda). C++ 14 telah menambahkan beberapa lagi, tetapi kebanyakan dari mereka benar-benar lebih nyaman daripada segala macam perubahan besar dalam orientasi.

8
Jerry Coffin

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

1
zvrba