Каковы основные различия между Objective-C и C ++ с точки зрения синтаксиса, функций, парадигм, каркасов и библиотек?
* Важно: моя цель не состоит в том, чтобы начать войну между двумя языками. Я хочу только очень веских фактов. На самом деле мой вопрос не связан с производительностью! Пожалуйста, дайте источники для всего, что может показаться субъективным.
c++
objective-c
Alerty
источник
источник
Ответы:
Краткий список некоторых основных отличий:
bool
,true
иfalse
, Objective-C используетBOOL
,YES
иNO
.void*
иnullptr
, Objective-C предпочитаетid
иnil
.SEL
) в качестве приблизительного эквивалента указателям на функции.nil
, в отличие от C ++, который вылетит, если вы попытаетесь вызвать функцию-членnullptr
Objective-C допускает динамическую диспетчеризацию, позволяя классу, отвечающему на сообщение, быть определенным во время выполнения, в отличие от C ++, где объект, к которому вызывается метод, должен быть известен во время компиляции (см. Комментарий wilhelmtell ниже). Это связано с предыдущим пунктом.self
и инициализаторам класса (подобно конструкторам) возвращать совершенно другой класс, если это необходимо. В отличие от C ++, где, если вы создаете новый экземпляр класса (либо неявно в стеке, либо явно черезnew
), он гарантированно будет того типа, который вы указали изначально.int foo (void)
иint foo (int)
определяют неявную перегрузку методаfoo
, но для достижения того же в Objective-C требуются явные перегрузки- (int) foo
и- (int) foo:(int) intParam
. Это связано с тем, что именованные параметры Objective-C функционально эквивалентны искажению имен в C ++.alloc
сообщением, либо неявно в соответствующем методе фабрики).На мой взгляд, наверное, самая большая разница в синтаксисе. Вы можете добиться практически одинаковых результатов на любом языке, но, на мой взгляд, синтаксис C ++ проще, в то время как некоторые функции Objective-C облегчают выполнение определенных задач (например, дизайн GUI) благодаря динамической диспетчеризации.
Вероятно, много других вещей, которые я пропустил, я буду обновлять с другими вещами, которые я думаю. Кроме этого, я настоятельно рекомендую вам руководство, на которое указала LiraNuna. Кстати, другой интересный сайт может быть этим .
Я также должен отметить, что я только начинаю изучать Objective-C сам, и поэтому многое из вышеперечисленного может быть не совсем правильным или полным - я прошу прощения, если это так, и приветствую предложения по улучшению.
РЕДАКТИРОВАТЬ: обновлено с учетом вопросов, поднятых в следующих комментариях, добавлено еще несколько пунктов в список.
источник
void*
иNULL
, но не для объектов. Вы можете использовать любой указатель в стиле C в Obj-C, и многие вызовы API фактически передают или возвращают значения по ссылке, и в этом случаеNULL
часто используется.Хотя они оба основаны на C, это два совершенно разных языка.
Основное отличие состоит в том, что Objective-C ориентирован на решения времени выполнения для диспетчеризации и сильно зависит от библиотеки времени выполнения для обработки наследования и полиморфизма, тогда как в C ++ основное внимание обычно уделяется статическим решениям во время компиляции.
Что касается библиотек, вы можете использовать простые библиотеки C на обоих языках, но их нативные библиотеки совершенно разные.
Интересно, однако, что вы можете смешивать оба языка (с некоторыми ограничениями). Результат называется Objective-C ++ .
источник
Они совершенно разные. Objective C имеет больше общего с Smalltalk, чем с C ++ (ну, за исключением синтаксиса, на самом деле).
источник
С верхней части моей головы:
Для меня самая большая разница в модели системы. Obj-C позволяет вам осуществлять обмен сообщениями и самоанализ, но C ++ имеет очень мощные шаблоны.
У каждого есть свои сильные стороны.
источник
Как уже говорили другие, Objective-C гораздо более динамичен с точки зрения того, как он думает об объектах по сравнению с довольно статической областью C ++.
Objective-C, находящийся в линии Smalltalk объектно-ориентированных языков, имеет концепцию объектов, которая очень похожа на концепцию Java, Python и других "стандартных" неоригинальных объектно-ориентированных языков. Много динамической отправки, без перегрузки операторов, отправка сообщений.
C ++ - это свое странное животное; это в основном пропустило часть Smalltalk родословной. В некотором смысле он имеет хорошую модульную систему с поддержкой наследования, которая может использоваться для объектно-ориентированного программирования. Все гораздо более статично (например, переопределяемые методы не используются по умолчанию).
источник
Objective-C является более совершенным надмножеством C. В C и Objective-C
void*
допускается неявное приведение к указателю структуры.C ++ не будет компилироваться, если
void
указатель явно не приведен:Актуальность этого для повседневного программирования равна нулю, просто забавный факт.
источник
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
затем использовать встроенный конструктор. Но на сегодняшний день его Modern C ++ больше похожauto bar = new Foo(constructorArg);
на то, что вам фактически не нужен malloc, и вы можете использовать либо callicstd::vector::reserve
, иstd::vector::emplace_mack
Obj-C имеет гораздо больше динамических возможностей в самом языке, тогда как C ++ больше ориентирован на возможности времени компиляции с некоторыми динамическими возможностями.
В C ++ параметрический полиморфизм проверяется во время компиляции, тогда как в Obj-C параметрический полиморфизм достигается посредством динамической диспетчеризации и не проверяется во время компиляции.
Obj-C очень динамичен по своей природе. Вы можете добавлять методы в класс во время выполнения. Кроме того, он имеет самоанализ во время выполнения, чтобы посмотреть на классы. В C ++ определение класса не может измениться, и весь самоанализ должен быть выполнен во время компиляции. Хотя динамическая природа Obj-C может быть достигнута в C ++ с использованием карты функций (или чего-то подобного), она все еще более многословна, чем в Obj-C.
В C ++ намного больше проверок, которые можно выполнить во время компиляции. Например, используя тип варианта (например, объединение), компилятор может принудительно предписывать, чтобы все случаи записывались или обрабатывались. Таким образом, вы не забываете о крайних случаях проблемы. Тем не менее, все эти проверки имеют цену при компиляции. Obj-C гораздо быстрее компилируется, чем C ++.
источник