Подтвердить что ты не робот

За исключением ООП, почему C++ лучше, чем C?

Ну, это может звучать как вопрос тролля, но поскольку С++ кажется сложным полностью освоить (и я никогда не знал, что STL на самом деле "частично" ), мне хотелось знать, каковы недостатки использования C вместо С++ когда не много полагается на ООП.

С++ иногда может иметь очень сложный синтаксис, который меня смущает, пытаясь использовать OGRE3D, например...

4b9b3361

Ответ 1

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

С другой стороны, нет недостатка в использовании С++: он сохраняет цели производительности C, и это довольно низкий уровень языка, позволяя очень мощные вещи. И вы не пропустите ни одной функции C с помощью С++!

И не забывайте широкую базу пользователей и богатые библиотеки и фреймворки.

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

Ответ 2

Не-OO-функции, которые С++ имеет, что C не:

  • Шаблоны
  • Перегрузка функций
  • Ссылки
  • Пространство имен
  • Вы можете использовать struct и enum без записи struct или enum перед каждым объявлением или с помощью typedefs.
  • Даже если вы не определяете свои собственные классы, использование строк С++ и классов контейнеров по-прежнему часто более удобно и безопасно для работы с строками и массивами c-стиля.
  • Тип безопасности (даже если некоторые называют его слабым)
  • Исключения
  • Переменные объявления в условных выражениях, C99 имеет только for

Ответ 3

Я большой поклонник C, который со временем стал большим поклонником C++. Одной из главных причин этого является STL (Стандартная библиотека шаблонов) и Boost.

Между двумя из них очень легко писать мощные портативные приложения.

Ответ 4

Одна "особенность", о которой не упоминалось много (но, я думаю, примечательно), заключается в том, что сообщество компиляторов С++, похоже, хочет пойти на гораздо большую работу для создания соответствующих реализаций. Назад, когда стандарт, который в конечном итоге стал C89/90, работал, почти каждый поставщик компилятора работал в соответствии с последними черновыми стандартами, и (особенно, когда стандарт был близок к завершению) действительно поставил большую работу в соответствие как они могли.

Это уже не так. Стандарт C99 был (очевидно, достаточно) завершен более десяти лет назад, но по-прежнему в основном существует только одна реализация, которая делает серьезную попытку соответствовать всему стандарту (Comeau). Несколько других (например, gcc) добавили некоторые функции C99, но по-прежнему отсутствуют достаточное количество других. Один (pcc) находится в довольно парадоксальном положении, добавив почти все функции, характерные для C99, но не очень близко соответствует требованиям C89/90.

Учитывая сложность С++, выполнение согласованной реализации является гораздо более сложной задачей. Несмотря на это, я бы предположил, что есть уже больше реализаций, которые по крайней мере действительно близки к тому, чтобы соответствовать С++ 0x (из-за того, что они были ратифицированы через год или два), чем с C99 (ратифицировано примерно десять лет назад). Чтобы выбрать произвольное число, я ожидаю увидеть 3 соответствия 1 реализаций С++ 0x раньше, чем 3 соответствующих реализации C99 (на самом деле, я почти ожидал, что многие дни ратифицировало).

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

Ответ 5

Ссылки выполняются автоматически и намного безопаснее по сравнению с указателями, стандартная библиотека гораздо более обширна, шаблоны делают код чрезвычайно настраиваемым и значительно быстрее и безопаснее. С++ предлагает фантастическое использование/повторное использование кода и организацию. Кроме того, если вы не слишком полагаетесь на ООП, тогда вы делаете это неправильно. Время, когда объекты не подходят, но они не являются большинством сценариев.

Ответ 6

[Примечание: это субъективный ответ, но сам вопрос имеет тенденцию ссылаться на субъективные ответы от природы].

С++ - это язык с несколькими парадигмами, и для него намного больше, чем ООП. Однако, чтобы предложить это просто лучше, чем C, немного... смело.: -D В руках опытного C-кодера и для правильных целей C-код может быть очень изящным и простым. Рассмотрим интерпретатор Lua, который закодирован в C; он компилируется в очень маленький двоичный файл, который, вероятно, был бы намного больше даже в руках столь же опытного программиста на С++ и поэтому хорошо подходит для встроенного использования. C, как правило, не будет таким же безопасным (например: неявное литье, требуется ручная очистка ресурсов и т.д.), Что является одной вещью, которую С++ стремится сделать немного лучше, чем C, но также не будет обременять программиста неудобным синтаксисом каста ( в С++ не нужно часто бросать, но в C это довольно часто), например

С другой стороны, и я стараюсь говорить в целом, С++ может упростить создание более эффективного кода, особенно для кода, который должен работать с несколькими типами. Тесты qsort vs std:: sort являются классическим примером этого и как С++, посредством шаблонов и встроенных объектов функций, может обеспечить рентабельные абстракции. В C нужно было бы написать отдельный алгоритм сортировки для каждого типа вручную или добавить его в макрос для достижения сопоставимых результатов.

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

Что касается особых различий, sepp2k уже указал на довольно полный список.

Ответ 7

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

Многие функции C99 очень приятные и до сих пор не находятся на С++.

Ответ 8

Кроме того, что были отмечены sepp2k (и я aggree с), это, безусловно, также имеет некоторые незначительные недостатки, которые напрямую не связаны с OO. Вспомните отсутствие __VA_ARGS__ для препроцессора и чувствительности к контексту. Рассмотрим что-то вроде:

switch (argc) {
 case 1: /* empty statement */;
         toto T;
 case 2: break;
}

В C, когда компилятор встречает такой фрагмент кода, и argc и toto известны, это действительно. (Конечно, мы можем получить предупреждение для унифицированного T потом, откуда мы его используем.)

В С++ это зависит от типа toto. Если это POD, все нормально (хорошо, так же хорошо, как и для C). Если у него есть конструктор, код недействителен: переход к метке case пересекает инициализацию "toto T".

Итак, в некотором смысле, для С++ вы должны понимать базовые типы, чтобы убедиться, что поток управления действителен.

Ответ 9

Вы можете продолжать писать по существу код C, но скомпилировать его как С++ и получить преимущество более сильной проверки типов и, следовательно, более надежного кода.

Если вы хотите представить полезные элементы С++, которые не имеют ничего общего с OO, например, встроенная функция bool, перегрузка функций и более определенная обработка констант (нет необходимости использовать макросы для постоянной константы символы).

Не слишком много возможностей для использования некоторых из более простых в понимании и использовании элементов стандартной библиотеки, таких как std::string и iostreams, и даже std::vector как "лучший массив"; вам не нужно многому учиться на С++ или понимать ООП, чтобы воспользоваться этими улучшенными интерфейсами.

Между OOP и процедурным программированием существует промежуточное Object Based Programming, которое поддерживает С++ и которое проще понять и узнать, и почти так же полезный как полный ООП. В основном он использует абстрактные типы данных, а не полные классы и избегает наследования и полиморфизма. Честно говоря, это то, что многие программисты на C++ пишут в любом случае.