Ответ 1
Краткий список некоторых основных отличий:
- С++ допускает множественное наследование, Objective-C не работает.
- В отличие от С++, Objective-C позволяет назначать параметры метода, а подпись метода включает только имена и типы параметров и тип возвращаемого значения (см. ниже комментарии bbum и Chuck). Для сравнения, сигнатура функции члена С++ содержит имя функции, а также только типы параметров /return (без их имен).
- С++ использует
bool
,true
иfalse
, Objective-C используетbool
,YES
иNO
. - С++ использует
void*
иnullptr
, Objective-C предпочитаетid
иnil
. - Objective-C использует "селекторы" (которые имеют тип
SEL
) в качестве приблизительного эквивалента указателям на функции. - Objective-C используется парадигма обмена сообщениями (a la Smalltalk), где вы можете отправлять "сообщения" объектам с помощью методов/селекторов.
- Objective-C с радостью позволит вам отправить сообщение на
nil
, в отличие от С++, который выйдет из строя, если вы попытаетесь вызвать функцию-членnullptr
-
Objective-C позволяет динамическую отправку, позволяя определить класс, отвечающий за сообщение, во время выполнения, в отличие от С++, где объект, к которому вызывается метод, должен быть известен во время компиляции (см. комментарий wilhelmtell ниже). Это связано с предыдущей точкой. - Objective-C позволяет автогенерировать аксессуаров для переменных-членов, используя "свойства".
- Objective-C позволяет назначать
self
и позволяет инициализаторам классов (аналогично конструкторам) возвращать совершенно другой класс, если это необходимо. Контраст с С++, где, если вы создаете новый экземпляр класса (либо неявно в стеке, либо явно черезnew
), гарантированно будет того типа, который вы изначально указали. - Аналогично, в Objective-C другие классы также могут динамически изменять целевой класс во время выполнения, чтобы перехватывать вызовы методов.
- Objective-C отсутствует функция пространства имен С++.
- Objective-C отсутствует эквивалент ссылок на С++.
- Objective-C не хватает шаблонов, предпочитающих (например), вместо этого разрешить слабую типизацию в контейнерах.
- Objective-C не допускает перегрузку неявных методов, но С++ делает. То есть, в С++
int foo (void)
иint foo (int)
определяют неявную перегрузку методаfoo
, но для достижения того же в Objective-C требуются явные перегрузки- (int) foo
и- (int) foo:(int) intParam
. Это связано с тем, что параметры Objective-C, которые функционально эквивалентны кодовому имени С++. - Objective-C с радостью позволит методу и переменной использовать одно и то же имя, в отличие от С++, который обычно имеет подгонки. Я полагаю, что это связано с Objective-C с использованием селекторов вместо указателей на функции, и, следовательно, имена методов не имеют фактически "значения".
- Objective-C не позволяет создавать объекты в стеке - все объекты должны быть выделены из кучи (либо явно с сообщением
alloc
, либо неявно в соответствующем методе factory). - Как и С++, Objective-C имеет как структуры, так и классы. Однако, если в С++ они рассматриваются как почти то же самое, в Objective-C они обрабатываются по-разному - вы можете создать структуры в стеке, например.
На мой взгляд, вероятно, самая большая разница - это синтаксис. Вы можете добиться практически одинаковых вещей на любом языке, но, на мой взгляд, синтаксис С++ проще, тогда как некоторые из функций Objective-C упрощают задачу (например, графический интерфейс) благодаря динамической диспетчеризации.
Вероятно, много других вещей, которые я пропустил, я обновлю любые другие вещи, о которых я думаю. Кроме этого, вы можете очень рекомендовать гида, на который указал LiraNuna. Кстати, другой интересный сайт может быть this.
Я должен также указать, что я только начинаю изучать Objective-C сам, и поскольку такая много из вышеперечисленного может быть не совсем корректной или полной, я извиняюсь, если это так, и приветствую предложения по улучшению.
EDIT: обновлено для решения вопросов, поднятых в следующих комментариях, добавлено еще несколько элементов в список.