Краткий список некоторых основных отличий:
- 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 использует парадигму обмена сообщениями (а-ля 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 сам, и поэтому многое из вышеперечисленного может быть не совсем правильным или полным - я прошу прощения, если это так, и приветствую предложения по улучшению.
РЕДАКТИРОВАТЬ: обновлено с учетом вопросов, поднятых в следующих комментариях, добавлено еще несколько пунктов в список.