Насколько отличается Objective-C от С++?

В чем основные отличия между Objective-C и С++ в терминах синтаксиса, функций, парадигм, фреймворков и библиотек?

* Важно: Моя цель - не начать войну производительности между двумя языками. Мне нужны только реальные факты. На самом деле, мой вопрос не связан с производительностью! Пожалуйста, дайте источники для всего, что может показаться субъективным.

Ответ 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: обновлено для решения вопросов, поднятых в следующих комментариях, добавлено еще несколько элементов в список.

Ответ 2

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

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

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

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

Ответ 3

Сверху моей головы:

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

В, параметрический полиморфизм С++ проверяется во время компиляции, тогда как в Obj-C параметрический полиморфизм достигается посредством динамической отправки и не проверяется во время компиляции.

Obj-C имеет очень динамичный характер. Вы можете добавлять методы в класс во время выполнения. Кроме того, у него есть интроспекция во время выполнения, чтобы посмотреть классы. В С++ определение класса не может измениться, и вся интроспекция должна выполняться во время компиляции. Хотя динамическая природа Obj-C может быть достигнута в С++ с использованием карты функций (или что-то в этом роде), она еще более многословна, чем в Obj-C.

В С++ существует намного больше проверок, которые можно выполнить во время компиляции. Например, используя тип варианта (например, объединение), компилятор может обеспечить, чтобы все случаи были написаны или обработаны. Поэтому вы не забываете о том, как обращаться с краевыми случаями проблемы. Однако при компиляции все эти чеки приходятся на цену. Obj-C намного быстрее при компиляции, чем С++.

Ответ 7

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

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

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

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

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