Короткий перелік деяких основних відмінностей:
- C ++ дозволяє багаторазово успадкувати, Objective-C не дозволяє.
- На відміну від C ++, Objective-C дозволяє називати параметри методу, а підпис методу включає лише імена та типи параметрів та тип повернення (див. Коментарі bbum та Чука нижче). Для порівняння, підпис функції C ++ члена містить ім'я функції, а також лише типи параметрів / повернення (без їх назв).
- C ++ використовує
bool
, true
і false
, Objective-C використовує BOOL
, YES
і NO
.
- C ++ використовує
void*
і nullptr
, Objective-C віддає перевагу id
і nil
.
- Objective-C використовує "селектори" (які мають тип
SEL
) як приблизний еквівалент функціональним вказівникам.
- Objective-C використовує парадигму обміну повідомленнями (a la Smalltalk), де ви можете надсилати "повідомлення" об'єктам за допомогою методів / селекторів.
- Objective-C з радістю дозволить вам надіслати повідомлення
nil
, на відміну від C ++, яке вийде з ладу, якщо ви спробуєте викликати функцію членаnullptr
Objective-C дозволяє динамічно відправляти, що дозволяє класу, що відповідає на повідомлення, визначатись під час виконання, на відміну від C ++, де об’єкт, на який викликається метод, повинен бути відомий під час компіляції (див. Коментар wilhelmtell нижче). Це пов’язано з попереднім пунктом.
- Objective-C дозволяє автогенерувати аксесуари для змінних членів, використовуючи "властивості".
- Objective-C дозволяє присвоїти
self
і дозволяє ініціалізаторам класів (подібним до конструкторів) повернути зовсім інший клас за бажанням. На відміну від C ++, якщо, якщо ви створюєте новий екземпляр класу (неявно в стеці, або явно через new
), гарантовано він буде типом, який ви вказали спочатку.
- Аналогічно, в Objective-C інші класи також можуть динамічно змінювати цільовий клас під час виконання для перехоплення викликів методів.
- У Objective-C відсутня функція простору імен C ++.
- У Objective-C відсутня еквівалент посилання на C ++.
- У Objective-C не вистачає шаблонів, вважаючи за краще (наприклад) замість того, щоб дозволити слабкий набір тексту в контейнерах.
- Objective-C не дозволяє неявно перевантажувати метод, але C ++ робить. Тобто в C ++
int foo (void)
і int foo (int)
визначається неявна перевантаження методу foo
, але для досягнення того ж в Objective-C потрібні явні перевантаження - (int) foo
і - (int) foo:(int) intParam
. Це пов'язано з тим, що названі параметри Objective-C функціонально еквівалентні керуванню іменем C ++.
- Objective-C із задоволенням дозволить методу та змінній ділитися тим самим іменем, на відміну від C ++, який зазвичай має відповідність. Я думаю, що це пов'язане з Objective-C, використовуючи селектори замість функціональних покажчиків, і таким чином імена методів насправді не мають "значення".
- Objective-C не дозволяє створювати об'єкти на стеку - всі об’єкти повинні бути розподілені з купи (явно з
alloc
повідомленням, або неявно у відповідному заводському методі).
- Як і C ++, у Objective-C є і структури, і класи. Однак там, де в C ++ вони трактуються майже точно так само, в Objective-C вони трактуються дико по-різному - наприклад, можна створювати структури на стеку.
На мою думку, мабуть, найбільша різниця - це синтаксис. Ви можете досягти одних і тих же речей на будь-якій мові, але, на мою думку, синтаксис C ++ простіший, тоді як деякі функції Objective-C полегшують певні завдання (наприклад, дизайн GUI) завдяки динамічній розсилці.
Можливо, ще багато інших речей, які я пропустив, я оновлю будь-які інші речі, про які я думаю. Крім цього, настійно рекомендую, щоб керівництво LiraNuna вказало на вас. Між іншим, може бути це ще одне цікаве місце .
Я також повинен зазначити, що я саме починаю вивчати Objective-C сам, і як таке багато вищезазначеного може бути не зовсім коректним або повним - прошу вибачення, якщо це так, і вітаю пропозиції щодо вдосконалення.
EDIT: оновлено для вирішення питань, викладених у наступних коментарях, додав до списку ще кілька пунктів.