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.
c++
objective-c
Alerty
sumber
sumber
Jawaban:
Daftar pendek dari beberapa perbedaan utama:
bool
,true
dan , Penggunaanfalse
Objective-CBOOL
,YES
danNO
.void*
dannullptr
, Objective-C lebih sukaid
dannil
.SEL
) sebagai perkiraan yang setara dengan pointer fungsi.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.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 melaluinew
) itu dijamin dari tipe yang Anda tentukan sebelumnya.int foo (void)
danint foo (int)
mendefinisikan overload implisit dari metodefoo
, tetapi untuk mencapai hal yang sama di Objective-C membutuhkan overload eksplisit- (int) foo
dan- (int) foo:(int) intParam
. Hal ini disebabkan parameter bernama Objective-C yang secara fungsional setara dengan mangling nama C ++.alloc
pesan, atau secara implisit dalam metode pabrik yang sesuai).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.
sumber
void*
danNULL
, 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 halNULL
ini sering digunakan.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 ++ .
sumber
Mereka sangat berbeda. Objective C memiliki lebih banyak kesamaan dengan Smalltalk daripada dengan C ++ (well, kecuali untuk sintaks, sungguh).
sumber
Dari atas kepala saya:
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.
sumber
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).
sumber
Objective-C adalah superset lebih sempurna dari C. Di C dan casting implisit Objective-C dari
void*
ke pointer pointer diperbolehkan.C ++ tidak akan dikompilasi kecuali
void
pointer secara eksplisit dilemparkan:Relevansi ini untuk pemrograman setiap hari adalah nol, hanya fakta trivia yang menyenangkan.
sumber
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
maka mungkin gunakan inplace constructor .. Tapi sampai hari ini C ++ Modern lebih sepertiauto bar = new Foo(constructorArg);
sebenarnya Anda tidak perlu malloc, dan entah itu callic, Anda dapat menggunakanstd::vector::reserve
, danstd::vector::emplace_mack
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 ++.
sumber