Почему C ++ лучше C? Помимо очевидного списка возможностей, на мой взгляд, реальный ответ состоит в том, что нет веских причин по-прежнему использовать C вместо C ++ . Даже если вы не используете ООП, вы можете использовать его как лучший C . Даже если вы только один раз используете уникальную возможность C ++ в своей программе, C ++ уже является победителем.
С другой стороны, нет недостатков в использовании C ++ : он сохраняет цели производительности C, и это язык довольно низкого уровня, позволяющий при этом очень мощные вещи. И вы не пропустите ни одной функции C, использующей C ++!
И не забывайте о широкой пользовательской базе, а также о богатых доступных библиотеках и фреймворках.
Кстати, в C99 добавлены некоторые интересные функции, но спустя десятилетие поддержка компилятора все еще очень ограничена (так что вы привязаны к ANSI C). Тем временем C ++ также развивался, и поставщики компиляторов стремятся предоставить соответствующие реализации.
Вы можете продолжать писать по существу код C, но скомпилировать его как C ++ и получить преимущества более строгой проверки типов и, следовательно, более надежного кода.
Затем вы можете, если хотите, представить полезные элементы C ++, которые не имеют ничего общего с объектно-ориентированными объектами, такие как встроенный bool
, перегрузка функций и более определенная обработка констант (нет необходимости использовать макросы для буквальных постоянных символов).
Использование некоторых из наиболее простых для понимания и использования элементов стандартной библиотеки, таких как std :: string
и iostreams, и даже std :: vector в качестве "лучший массив"; вам не нужно много изучать C ++ или понимать ООП, чтобы воспользоваться преимуществами этих улучшенных интерфейсов.
Между ООП и процедурным программированием существует промежуточное объектно-ориентированное программирование , которое поддерживает C ++, которое проще для понимания и изучения и почти так же полезно, как и полное ООП. В основном он использует абстрактные типы данных, а не полные классы, и избегает наследования и полиморфизма. Честно говоря, это то, что в любом случае пишут многие программисты на C ++.
Не-объектно-ориентированные функции, которые есть в C ++, которых нет в C:
struct
s и enum
без записи struct
или enum
перед каждым объявлением или с использованием typedefs. для
Я большой поклонник C
, который со временем стал большим поклонником C ++
. Одной из основных причин этого является STL ( Стандартная библиотека шаблонов ) и Boost .
С их помощью очень легко писать мощные переносимые приложения.
Ссылки создаются автоматически и намного безопаснее по сравнению с указателями, стандартная библиотека гораздо более обширна, шаблоны делают код чрезвычайно настраиваемым, значительно быстрее и безопаснее. C ++ предлагает фантастическое использование / повторное использование и организацию кода. Кроме того, если вы не слишком полагаетесь на ООП, значит, вы делаете это неправильно. Бывают случаи, когда объекты не подходят, но это не большинство сценариев.
Одна из причин написания библиотек на C заключается в том, что очень легко использовать эту библиотеку на разных языках, поскольку C ABI очень прост по сравнению с беспорядком, искажающим имена, которым является C++ ABI. Создание интерфейсов C для библиотек C++ может быть достойным решением, но если вы можете легко выразить свой API с помощью синтаксиса C, зачем писать его на C++ для начала?
Многие функции C99 очень хороши и все еще не в C++.
[Примечание: это субъективный ответ, но сам вопрос имеет тенденцию вызывать субъективные ответы по своей природе].
C ++ - это язык с множеством парадигм, и это намного больше, чем ООП. Однако предположить, что это просто лучше, чем C, немного ... жирно. :-D В руках опытного программиста на C и для правильных целей код на C может быть очень элегантным и простым. Рассмотрим интерпретатор Lua, написанный на C; он компилируется в очень маленький двоичный файл, который, вероятно, был бы намного больше даже в руках столь же опытного программиста на C ++, и поэтому хорошо подходит для встроенного использования. C обычно не будет таким безопасным (например, неявное приведение типов, требуется очистка ресурсов вручную и т. Д.), Что является одной из вещей, которые C ++ пытается сделать немного лучше, чем C, но он также не обременяет программиста неудобным синтаксисом преобразования ( в C ++ не нужно часто приводить приведение, но в C это довольно часто), например
С другой стороны, и я пытаюсь говорить очень обобщенно, C ++ действительно может облегчить написание более эффективного кода, особенно для кода, который должен работать с несколькими типами. Тесты qsort vs std :: sort - классический пример того, как C ++ с помощью шаблонов и встроенных функциональных объектов может предоставлять бесплатные абстракции. В C нужно было бы написать отдельный алгоритм сортировки для каждого типа вручную или вставить его в макрос для достижения сопоставимых результатов.
Большинство программистов на C ++, перешедших с C, никогда не оглядываются назад.Я могу быть чудаком, но я все же считаю C полезным для реализации небольших библиотек. Для начала, его немного проще портировать, и он строится очень быстро. Для подобных вещей я считаю неявное приведение типов как должное. Однако я бы не хотел работать с любым кодом C в больших масштабах, и, к сожалению, время от времени приходилось это делать.
Что касается конкретных различий, sepp2k уже указал довольно исчерпывающий список.
Помимо положительных сторон, отмеченных sepp2k (и я согласен с ними), у него, безусловно, есть некоторые небольшие недостатки, которые напрямую не связаны делать с OO. Вспомним отсутствие __ VA_ARGS __
для препроцессора и контекстной чувствительности. Рассмотрим что-то вроде:
switch (argc) {
case 1: /* empty statement */;
toto T;
case 2: break;
}
В C, когда компилятор встречает такой фрагмент кода и известны argc
и toto
, это действительно так. (Конечно, впоследствии мы можем получить предупреждение для унифицированного T, откуда мы его используем.)
В C ++ это зависит от типа toto
. Если это POD, то все нормально (ну, как и для C). Если у него есть конструктор, код недействителен: переход к метке case пересекает инициализацию 'toto T' .
Таким образом, в некотором смысле для C ++ вы должны понимать базовые типы, чтобы увидеть, действителен ли поток управления.
Одна «особенность», о которой не так много упоминалось (но я думаю, что она заслуживает внимания) состоит в том, что сообщество компиляторов C ++, похоже, готово приложить гораздо больше усилий для создания соответствующих реализаций. Когда стандарт, который в конечном итоге стал C89 / 90, был в работе, почти все поставщики компиляторов работали над соответствием последним проектам стандарта и (особенно когда стандарт был близок к завершению) действительно приложили много усилий для того, чтобы соответствовать максимально точному соответствию. как могли.
Это уже не так. Стандарт C99 был (очевидно, достаточно) завершен более десяти лет назад, но в основном до сих пор существует только одна реализация, которая делает серьезную попытку согласования со стандартом в целом (Comeau). Некоторые другие (например, gcc) добавили некоторые функции C99, но все еще не имеют достаточного количества других. Один (pcc) находится в довольно парадоксальном положении, добавив почти все функции, характерные для C99, но не очень близко соответствует требованиям C89 / 90.
Учитывая сложность C ++, создание соответствующей реализации является гораздо более сложной задачей.Несмотря на это, я предполагаю, что уже существует больше реализаций, которые, по крайней мере, действительно близки к соответствию C ++ 0x (который должен быть ратифицирован через год или два), чем C99 (ратифицирован примерно десять лет назад). Просто чтобы выбрать произвольное число, я бы ожидал увидеть 3 соответствующих 1 реализации C ++ 0x раньше, чем 3 соответствующих реализации C99 (на самом деле, я почти ожидал, что многие в день его ратификации ).