Краткий список основных различий:
bool
, true
и false
, Objective-C использует BOOL
, YES
и NO
. void*
и nullptr
, Objective-C предпочитает id
и nil
. SEL
) в качестве приблизительного эквивалента указателей функций. nil
, в отличие от C++, который аварийно завершит работу, если вы попытаетесь вызвать функцию-член nullptr
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 облегчают выполнение определенных задач (например, разработку графического интерфейса) благодаря динамической диспетчеризации.
Возможно, я упустил еще много других вещей, я буду обновлять информацию, если вспомню что-то еще. В остальном, могу настоятельно рекомендовать руководство, на которое указала LiraNuna. Кстати, еще одним интересным сайтом может быть этот.
Я также должен отметить, что я сам только начинаю изучать Objective-C, и поэтому многое из вышесказанного может быть не совсем правильным или полным - я прошу прощения, если это так, и приветствую предложения по улучшению.
EDIT: обновлено с учетом моментов, поднятых в следующих комментариях, добавлено еще несколько пунктов в список.
Как говорили другие, Objective-C гораздо более динамичен в с точки зрения того, как он думает об объектах по сравнению с довольно статичной областью C ++.
Objective-C, принадлежащий к линии Smalltalk объектно-ориентированных языков, имеет концепцию объектов, которая очень похожа на концепцию Java, Python и других «стандартных» объектно-ориентированных языков, отличных от C ++. Много динамической диспетчеризации, без перегрузки оператора, рассылка сообщений.
C ++ сам по себе странный зверь; он в основном пропускал часть генеалогического древа, посвященную Smalltalk. В некотором смысле у него есть хорошая модульная система с поддержкой наследования, которую можно использовать для объектно-ориентированного программирования. Вещи гораздо более статичны (например, переопределяемые методы не используются по умолчанию).
Objective-C является более совершенным надмножеством C. В C и Objective-Допускается неявное приведение C из void*
в указатель структуры.
Foo* bar = malloc(sizeof(Foo));
C++ не будет компилироваться, если указатель void
явно не приведен:
Foo* bar = (Foo*)malloc(sizeof(Foo));
Релевантность этого для ежедневного программирования равна нулю, просто забавный факт мелочи.
Навскидку:
На мой взгляд, самое большое различие - это система моделей. Obj-C позволяет вам делать обмен сообщениями и интроспекцию, но C++ имеет вечно могущественные шаблоны.
У каждого из них есть свои сильные стороны.
Они совершенно разные. Objective C имеет больше общего со Smalltalk, чем с C ++ (ну, правда, кроме синтаксиса).
Хотя они оба основаны на C, это два совершенно разных языка.
Основное отличие состоит в том, что Objective-C ориентирован на решения во время выполнения для диспетчеризации и сильно зависит от своей библиотеки времени выполнения для обработки наследования и полиморфизма, в то время как в C ++ основное внимание уделяется статическим решениям во время компиляции.
Что касается библиотек, вы можете использовать простые библиотеки C на обоих языках, но их собственные библиотеки совершенно разные.
Интересно, что вы можете смешивать оба языка (с некоторыми ограничениями). Результат называется Objective-C ++ .