Насколько отличающийся Objective C от C++? [закрытый]

166
задан nicael 21 May 2014 в 21:19
поделиться

6 ответов

Краткий список основных различий:

  • 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 облегчают выполнение определенных задач (например, разработку графического интерфейса) благодаря динамической диспетчеризации.

Возможно, я упустил еще много других вещей, я буду обновлять информацию, если вспомню что-то еще. В остальном, могу настоятельно рекомендовать руководство, на которое указала LiraNuna. Кстати, еще одним интересным сайтом может быть этот.

Я также должен отметить, что я сам только начинаю изучать Objective-C, и поэтому многое из вышесказанного может быть не совсем правильным или полным - я прошу прощения, если это так, и приветствую предложения по улучшению.

EDIT: обновлено с учетом моментов, поднятых в следующих комментариях, добавлено еще несколько пунктов в список.

180
ответ дан 23 November 2019 в 21:04
поделиться

Как говорили другие, Objective-C гораздо более динамичен в с точки зрения того, как он думает об объектах по сравнению с довольно статичной областью C ++.

Objective-C, принадлежащий к линии Smalltalk объектно-ориентированных языков, имеет концепцию объектов, которая очень похожа на концепцию Java, Python и других «стандартных» объектно-ориентированных языков, отличных от C ++. Много динамической диспетчеризации, без перегрузки оператора, рассылка сообщений.

C ++ сам по себе странный зверь; он в основном пропускал часть генеалогического древа, посвященную Smalltalk. В некотором смысле у него есть хорошая модульная система с поддержкой наследования, которую можно использовать для объектно-ориентированного программирования. Вещи гораздо более статичны (например, переопределяемые методы не используются по умолчанию).

6
ответ дан 23 November 2019 в 21:04
поделиться

Objective-C является более совершенным надмножеством C. В C и Objective-Допускается неявное приведение C из void* в указатель структуры.

Foo* bar = malloc(sizeof(Foo));

C++ не будет компилироваться, если указатель void явно не приведен:

Foo* bar = (Foo*)malloc(sizeof(Foo));

Релевантность этого для ежедневного программирования равна нулю, просто забавный факт мелочи.

6
ответ дан 23 November 2019 в 21:04
поделиться

Навскидку:

  1. Стили - Obj-C динамический, C++ - обычно статичен
  2. Хотя они оба являются ООП, я уверен, что решения будут разными.
  3. Различная объектная модель (C++ ограничена своей системой типов во время компиляции системой типов при компиляции).

На мой взгляд, самое большое различие - это система моделей. Obj-C позволяет вам делать обмен сообщениями и интроспекцию, но C++ имеет вечно могущественные шаблоны.

У каждого из них есть свои сильные стороны.

7
ответ дан 23 November 2019 в 21:04
поделиться

Они совершенно разные. Objective C имеет больше общего со Smalltalk, чем с C ++ (ну, правда, кроме синтаксиса).

7
ответ дан 23 November 2019 в 21:04
поделиться

Хотя они оба основаны на C, это два совершенно разных языка.

Основное отличие состоит в том, что Objective-C ориентирован на решения во время выполнения для диспетчеризации и сильно зависит от своей библиотеки времени выполнения для обработки наследования и полиморфизма, в то время как в C ++ основное внимание уделяется статическим решениям во время компиляции.

Что касается библиотек, вы можете использовать простые библиотеки C на обоих языках, но их собственные библиотеки совершенно разные.

Интересно, что вы можете смешивать оба языка (с некоторыми ограничениями). Результат называется Objective-C ++ .

32
ответ дан 23 November 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: