Seberapa berbeda Objective-C dari C ++? [Tutup]

171

Apa perbedaan utama antara Objective-C dan C ++ dalam hal sintaks, fitur, paradigma, kerangka kerja dan perpustakaan?

* Penting: Tujuan saya bukan untuk memulai perang kinerja antara kedua bahasa. Saya hanya ingin fakta nyata. Sebenarnya, pertanyaan saya tidak terkait dengan kinerja! Tolong beri sumber untuk apa pun yang mungkin tampak subjektif.

Alerty
sumber
2
Panduan ini memberikan perbandingan terbaik yang pernah saya lihat.
LiraNuna
@Oskar Kjellin: Jawaban Mac dan LiraNuna adalah jawaban yang sangat baik. Saya tidak dapat secara objektif memutuskan mana yang terbaik karena keduanya saling melengkapi satu sama lain.
Alerty
@ Alerty yah saya tahu (sering tersandung pada diri saya sendiri). Mungkin hanya menandai yang teratas sebagai dijawab yang merupakan apa yang saya lakukan ketika tidak dapat memutuskan. Saya tidak suka ketika ada pertanyaan yang tidak ditandai sebagai dijawab ketika mereka :(
Oskar Kjellin
1
Letakkan tautan ke jawaban kedua di yang pertama dan sebaliknya
Lee Taylor

Jawaban:

185

Daftar pendek dari beberapa perbedaan utama:

  • C ++ memungkinkan multiple inheritance, Objective-C tidak.
  • Tidak seperti C ++, Objective-C memungkinkan parameter metode diberi nama dan tanda tangan metode hanya menyertakan nama dan tipe parameter dan tipe pengembalian (lihat komentar bbum dan Chuck di bawah). Sebagai perbandingan, tanda tangan fungsi anggota C ++ berisi nama fungsi serta hanya jenis parameter / pengembalian (tanpa nama mereka).
  • Penggunaan C ++ bool, truedan , Penggunaan falseObjective-C BOOL, YESdan NO.
  • Penggunaan C ++ void*dan nullptr, Objective-C lebih suka iddan nil.
  • Objective-C menggunakan "selektor" (yang memiliki tipe SEL) sebagai perkiraan yang setara dengan pointer fungsi.
  • Objective-C menggunakan paradigma perpesanan (ala Smalltalk) di mana Anda dapat mengirim "pesan" ke objek melalui metode / penyeleksi.
  • Objective-C akan dengan senang hati membiarkan Anda mengirim pesan nil, tidak seperti C ++ yang akan macet jika Anda mencoba memanggil fungsi anggota darinullptr
  • Objective-C memungkinkan pengiriman dinamis, memungkinkan kelas merespons pesan yang akan ditentukan saat runtime, tidak seperti C ++ di mana objek metode dipanggil harus diketahui pada waktu kompilasi (lihat komentar wilhelmtell di bawah). Ini terkait dengan poin sebelumnya.
  • Objective-C memungkinkan autogenerasi accessors untuk variabel anggota menggunakan "properties".
  • Objective-C memungkinkan penugasan self, dan memungkinkan inisialisasi kelas (mirip dengan konstruktor) untuk mengembalikan kelas yang sama sekali berbeda jika diinginkan. Kontras dengan C ++, di mana jika Anda membuat instance baru dari sebuah kelas (baik secara implisit pada stack, atau secara eksplisit melalui new) itu dijamin dari tipe yang Anda tentukan sebelumnya.
  • Demikian pula, di Objective-C kelas lain juga dapat secara dinamis mengubah kelas target saat runtime untuk mencegat panggilan metode.
  • Objective-C tidak memiliki fitur namespace dari C ++.
  • Objective-C kurang setara dengan referensi C ++.
  • Objective-C tidak memiliki template, lebih suka (misalnya) untuk memungkinkan pengetikan kontainer yang lemah.
  • Objective-C tidak memungkinkan kelebihan metode implisit, tetapi C ++ tidak. Yaitu, di C ++ int foo (void)dan int foo (int)mendefinisikan overload implisit dari metode foo, tetapi untuk mencapai hal yang sama di Objective-C membutuhkan overload eksplisit - (int) foodan - (int) foo:(int) intParam. Hal ini disebabkan parameter bernama Objective-C yang secara fungsional setara dengan mangling nama C ++.
  • Objective-C akan dengan senang hati mengizinkan metode dan variabel untuk berbagi nama yang sama, tidak seperti C ++ yang biasanya cocok. Saya membayangkan ini ada hubungannya dengan Objective-C menggunakan penyeleksi daripada fungsi pointer, dan dengan demikian nama metode tidak benar-benar memiliki "nilai".
  • Objective-C tidak memungkinkan objek dibuat di stack - semua objek harus dialokasikan dari heap (baik secara eksplisit dengan allocpesan, atau secara implisit dalam metode pabrik yang sesuai).
  • Seperti C ++, Objective-C memiliki struct dan kelas. Namun, di mana di C ++ mereka diperlakukan hampir persis sama, di Objective-C mereka diperlakukan sangat berbeda - Anda dapat membuat struct pada stack, misalnya.

Menurut pendapat saya, mungkin perbedaan terbesar adalah sintaksis. Pada dasarnya Anda dapat mencapai hal-hal yang sama dalam kedua bahasa, tetapi menurut saya sintaks C ++ lebih sederhana sementara beberapa fitur Objective-C membuat tugas-tugas tertentu (seperti desain GUI) lebih mudah berkat pengiriman dinamis.

Mungkin banyak hal lain yang juga saya lewatkan, saya akan perbarui dengan hal lain yang saya pikirkan. Selain itu, bisa sangat merekomendasikan panduan LiraNuna menunjuk Anda. Kebetulan, situs lain yang menarik mungkin ini .

Saya juga harus menunjukkan bahwa saya sendiri baru mulai belajar Objective-C, dan karena itu banyak hal di atas mungkin tidak sepenuhnya benar atau lengkap - Saya minta maaf jika itu masalahnya, dan menyambut saran untuk perbaikan.

EDIT: diperbarui untuk mengatasi poin yang diangkat dalam komentar berikut, menambahkan beberapa item lagi ke daftar.

Mac
sumber
8
Daftar yang layak; satu koreksi. Mereka bukan "parameter bernama", tetapi "parameter yang disisipkan". Bernama dan "argumen kata kunci" menyebabkan kebingungan dalam berpikir bahwa beberapa bagian dari nama metode dapat dihilangkan. Itu tidak bisa.
bbum
7
Anda lupa mendaftar perbedaan yang paling penting: Objek-C menggunakan pengiriman dinamis, sedangkan C ++ menggunakan pengiriman statis. Dengan kata lain, kode yang dikompilasi oleh kompiler Objective-C akan memiliki kelas yang bertanggung jawab untuk menanggapi pesan yang ditentukan saat runtime; kode yang dikompilasi oleh kompiler C ++ membuat informasi ini dihitung dan dikompilasi di saat kompilasi.
wilhelmtell
9
@wilhelmtell: Kompiler C ++ hanya mengetahui superclass pada waktu kompilasi. Pada saat run time kelas yang sebenarnya bisa menjadi keturunan apa pun. Ini juga merupakan bentuk pengiriman dinamis, tetapi bukan bentuk yang sama seperti yang digunakan dalam Objective C. Berhati-hatilah dengan istilah-istilah teknis!
Norman Ramsey
5
+1 Daftar bagus. Namun, Objective-C juga menggunakan void*dan NULL, hanya saja tidak untuk objek. Anda dapat menggunakan penunjuk gaya-C di Obj-C, dan banyak panggilan API yang benar-benar melewati atau mengembalikan nilai dengan referensi, dalam hal NULLini sering digunakan.
Quinn Taylor
3
@wilhelmtell - Saya tidak tahu apa-apa tentang objektif-C, tetapi dalam C ++ Anda BISA secara dinamis memiliki kelas yang berbeda menanggapi panggilan fungsi, tetapi Anda harus memiliki sesuatu seperti array pointer ke kelas dasar, dan kemudian kelas AKTUAL yang "menggantung" darinya. Sementara semua kelas harus ada sub-kelas, panggilan metode AKAN memanggil metode yang berbeda tergantung pada kelas, pada saat run-time.
Kevin Anderson
33

Meskipun keduanya berakar dalam C, mereka adalah dua bahasa yang sangat berbeda.

Perbedaan utama adalah bahwa Objective-C berfokus pada keputusan runtime untuk pengiriman dan sangat bergantung pada pustaka runtime untuk menangani warisan dan polimorfisme, sedangkan dalam C ++ fokus biasanya terletak pada keputusan statis, waktu kompilasi, keputusan.

Mengenai pustaka, Anda dapat menggunakan pustaka C sederhana dalam kedua bahasa - tetapi pustaka asli mereka sangat berbeda.

Yang menarik adalah bahwa Anda dapat mencampur kedua bahasa (dengan beberapa batasan). Hasilnya disebut Objective-C ++ .

Georg Fritzsche
sumber
tautan yang diperbarui: Objective-C ++
IcyIcicle
6

Mereka sangat berbeda. Objective C memiliki lebih banyak kesamaan dengan Smalltalk daripada dengan C ++ (well, kecuali untuk sintaks, sungguh).

Dean Harding
sumber
6

Dari atas kepala saya:

  1. Gaya - Obj-C dinamis, C ++ biasanya statis
  2. Meskipun keduanya OOP, saya yakin solusinya akan berbeda.
  3. Model objek yang berbeda (C ++ dibatasi oleh sistem tipe kompilasi-waktunya).

Bagi saya, perbedaan terbesar adalah sistem model. Obj-C memungkinkan Anda melakukan olahpesan dan introspeksi, tetapi C ++ memiliki templat yang sangat kuat.

Masing-masing memiliki kekuatan mereka.

Rev316
sumber
5

Seperti yang orang lain katakan, Objective-C jauh lebih dinamis dalam hal bagaimana ia memikirkan objek vs ranah C ++ yang cukup statis.

Objective-C, yang berada dalam garis keturunan Smalltalk bahasa berorientasi objek, memiliki konsep objek yang sangat mirip dengan bahasa Jawa, Python, dan "standar" lainnya, bahasa berorientasi objek non-C ++. Banyak pengiriman dinamis, tidak ada operator overload, mengirim pesan sekitar.

C ++ adalah binatang anehnya sendiri; sebagian besar melewatkan bagian Smalltalk dari pohon keluarga. Dalam beberapa hal, ia memiliki sistem modul yang baik dengan dukungan untuk warisan yang kebetulan dapat digunakan untuk pemrograman berorientasi objek. Hal-hal yang jauh lebih statis (metode yang dapat ditimpa bukan default, misalnya).

Michael Ekstrand
sumber
4

Objective-C adalah superset lebih sempurna dari C. Di C dan casting implisit Objective-C dari void*ke pointer pointer diperbolehkan.

Foo* bar = malloc(sizeof(Foo));

C ++ tidak akan dikompilasi kecuali voidpointer secara eksplisit dilemparkan:

Foo* bar = (Foo*)malloc(sizeof(Foo));

Relevansi ini untuk pemrograman setiap hari adalah nol, hanya fakta trivia yang menyenangkan.

Igor Zevaka
sumber
Contoh kedua bukan kode C ++. Itu kode C yang memberi Anda kesalahan ketika Anda mencoba untuk mengkompilasinya dengan kompiler C ++. Jika Anda ingin C ++ lama mendekati aslinya, Anda akan menulis Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));maka mungkin gunakan inplace constructor .. Tapi sampai hari ini C ++ Modern lebih seperti auto bar = new Foo(constructorArg);sebenarnya Anda tidak perlu malloc, dan entah itu callic, Anda dapat menggunakan std::vector::reserve, danstd::vector::emplace_mack
xakepp35
3

Obj-C memiliki kemampuan yang jauh lebih dinamis dalam bahasa itu sendiri, sedangkan C ++ lebih fokus pada kemampuan kompilasi dengan beberapa kemampuan dinamis.

Dalam, polimorfisme parametrik C ++ diperiksa pada waktu kompilasi, sedangkan dalam Obj-C, polimorfisme parametrik dicapai melalui pengiriman dinamis dan tidak diperiksa pada waktu kompilasi.

Obj-C bersifat sangat dinamis. Anda bisa menambahkan metode ke kelas saat run-time. Juga, ini memiliki introspeksi saat run-time untuk melihat kelas. Dalam C ++, definisi kelas tidak dapat berubah, dan semua introspeksi harus dilakukan pada waktu kompilasi. Meskipun, sifat dinamis Obj-C dapat dicapai dalam C ++ menggunakan peta fungsi (atau sesuatu seperti itu), itu masih lebih bertele-tele daripada di Obj-C.

Di C ++, ada lebih banyak pemeriksaan yang dapat dilakukan pada waktu kompilasi. Sebagai contoh, menggunakan jenis varian (seperti serikat pekerja) kompiler dapat menegakkan bahwa semua kasus ditulis atau ditangani. Jadi Anda jangan lupa tentang menangani tepi kasus masalah. Namun, semua cek ini datang pada harga saat kompilasi. Obj-C jauh lebih cepat dalam kompilasi daripada C ++.

Paul Fultz II
sumber
3
Jika Anda akan berbicara tentang harga, bersikaplah adil! Sebaliknya, Obj-C jauh lebih lambat dalam menyelesaikan panggilan metode dinamis saat runtime daripada C ++. Dan saya berpendapat bahwa kecepatan kompilasi adalah hal yang relatif sepele dibandingkan dengan kecepatan runtime. Saya yakin Obj-C menawarkan banyak manfaat karena pengirimannya yang lebih dinamis, tetapi ada pertukaran di sana.
underscore_d
1
Benar, ada tradeoff antara runtime vs biaya waktu kompilasi. Namun, waktu kompilasi tidak selalu sepele. Menggunakan metaprogramming berat dan pustaka EDSL di C ++ (seperti Boost.Spirit) dapat memiliki efek drastis pada waktu kompilasi, sekaligus menghasilkan kode yang sangat cepat saat runtime.
Paul Fultz II
1
Tentu, saya terlalu menyederhanakan relatif terhadap POV dari basis kode yang lebih sederhana ... Dengan basis kode yang sangat kompleks, mengkompilasi ulang untuk menguji perubahan kecil mungkin membuat pengembangan sangat membosankan, yang bukan hal yang sepele. Tetapi apakah ini sesuatu yang benar-benar dapat kita bandingkan di antara keduanya? Bisakah pustaka semacam itu, yang begitu tergantung pada fitur waktu kompilasi C ++, entah bagaimana ditata kembali di Objective-C & ditampilkan untuk dikompilasi lebih cepat? yaitu apakah pernyataan "Obj-C jauh lebih cepat dalam mengkompilasi daripada C ++" merujuk pada basis kode setara yang dapat diukur speedup yang direplikasi? Kalau tidak, kita membandingkan waktu yang dibutuhkan untuk menanam apel dengan jeruk.
underscore_d