Какая разница между C и С++
Я знаю, что С++ имеет понятие объектов, но C не делает. Я также знаю, что почти все, что нужно знать о C, вписывается в K и R, но библиотека С++ значительно сложнее. Однако должны быть другие большие различия.
Каковы основные различия между C и С++?
Ответы
Ответ 1
Посмотрите FAQ Stroustrup здесь, в частности:
В чем разница между C и С++?
С++ - прямой потомок C, который сохраняет почти все С в качестве подмножества. С++ обеспечивает более надежную проверку типов чем C, и непосредственно поддерживает более широкий диапазон стилей программирования, чем C. С++ "лучше C" в том смысле, что он поддерживает стили программирования сделано с использованием C с лучшей проверкой типа и более значительная поддержка (без потеря эффективности). В то же самое смысл, ANSI C является лучшим C, чем K & R C. Кроме того, С++ поддерживает данные абстракция, объектно-ориентированная программирование и общее программирование (см. Язык программирования С++ (3-й Издание) "; проблемы совместимости доступны для загрузка).
Ответ 2
Язык С++ говорит, что они одинаковы:
int C = 0;
assert(C++ == C);
Ответ 3
Думаю, вы ответили на свой вопрос: Классы
Это совершенно другая парадигма дизайна. Я думаю, что путаница приходит, потому что многие люди разрабатывают программы на C++, которые в основном являются программами на С и даже не осознают этого.
Что позволяет, по слову своего создателя, Stroustrup:
Изменить: добавлены другие забавные вещи
Ответ 4
Короче говоря, C стремится стать "переносимым языком ассемблера". Это упрощает простейшие действия, позволяет делать вещи, которые отображаются почти непосредственно на базовом оборудовании, и не содержит много абстракций высокого уровня (у вас есть функции и... что об этом)
С++ пытается быть всем. Язык высокого уровня, язык низкого уровня, объектно-ориентированный язык, язык с несколькими парадигмами, язык системного программирования, встроенный язык программирования и язык разработки приложений.
Два языка действительно не имеют много общего, кроме некоторого общего синтаксиса. Программа C может компилироваться как С++ с незначительными изменениями, но она не будет иметь ничего общего с "правильным" кодом С++, написанным для языка.
Ответ 5
Здесь веб-сайт показывает "несовместимости" между c и С++:
http://david.tribble.com/text/cdiffs.htm#C++-vs-C
На самом деле существует довольно много областей, где c и С++ расходятся (в дополнение к классам, шаблону, исключениям и т.д.).
Что касается основных отличий, вот список, который хорошо его охватывает:
- анонимные союзы
- Классы
- конструкторы и деструкторы
- исключения и блоки try/catch
- внешние связи функций (например, extern "C" )
- перегрузка функций
- функции-члены
- Пространство имен
- новые и удаленные операторы и функции
- перегрузка оператора
- ссылочные типы
- стандартная библиотека шаблонов (STL)
- классы шаблонов
- функции шаблона
Ответ 6
С++ в основном является расширением C. Первоначально С++ назывался "C с классами", выделяя основное расширение исходного языка. Уже в то время поддерживалась перегрузка функций. С тех пор С++ приобрел исключения, иерархические пространства имен, общее программирование в виде шаблонов и, наконец, многопоточность > поддержка. Начиная с С++ 11, существует также минимальная поддержка основного языка для сборки мусора, например, сборщик мусора Boehm. Меньшие расширения включают ссылочные типы, синтаксис типов возвращаемых функций возврата, распределения памяти и освобождения, которые можно переопределить, информацию о типе времени выполнения и т.д.
Различия между C и С++, то есть между C и "подмножеством C" С++, суммированы в стандартном приложении С++ 11 C, озаглавленном "Совместимость", который составляет около 20 переполненных страниц, где раздел C1 который относится к совместимости C, составляет около 10 страниц.
Это было приложение C также в С++ 98 и С++ 03, а также приложение C также в новом новом стандарте С++ 14.
Начиная с С++ 11 в приложении C этого стандарта перечисляются следующие несовместимости между C и С++:
§C1.1 Лексические условные обозначения
Новые ключевые слова (§2.12)
Параграф относится только к С++ 11 §2.12. Следующий список был создан из этой таблицы и соответствующей таблицы в C99.
C99 C++11
_Bool
_Complex
_Imaginary
alignas
alignof
asm
auto auto
bool
break break
case case
catch
char char
char16_t
char32_t
class
const const
const_cast
constexpr
continue continue
decltype
default default
delete
do do
double double
dynamic_cast
else else
enum enum
explicit
export
extern extern
false
float float
for for
friend
goto goto
if if
inline inline
int int
long long
mutable
namespace
new
noexcept
nullptr
operator
private
protected
public
register register
reinterpret_cast
restrict
return return
short short
signed signed
sizeof sizeof
static static
static_assert
static_cast
struct struct
switch switch
template
this
thread_local
throw
true
try
typedef typedef
typeid
typename
union union
unsigned unsigned
using
virtual
void void
volatile volatile
wchar_t
while while
Тип символьного литерала изменяется от int
до char
(§2.14.3)
Строковые литералы, сделанные const
(§2.14.5)
§C1.2 Основные понятия
С++ не имеет "предварительных определений" (§3.1).
A struct
- это область в С++, а не в C (§3.3).
Имя области файла, явно объявленной как const, и явно не объявленное extern
, имеет внутреннюю связь, тогда как в C она будет иметь внешнюю связь ($ 3.5).
main
нельзя вызывать рекурсивно и не может иметь свой адрес (§3.6).
C разрешает "совместимые типы" в нескольких местах, С++ не выполняет (§3.9).
§C1.3 Стандартные преобразования.
Преобразование void*
в тип указателя к объекту требует кастинга (§4.10).
Только указатели на объекты не const
и энергонезависимые объекты могут быть неявно преобразованы в void*
(§ 4.10).
§C1.4 Выражения.
Неявное объявление функций не допускается (§5.2.2).
Типы должны быть объявлены в объявлениях, а не в выражениях (§5.3.3, §5.4).
Результат условного выражения, выражения присваивания или выражения для запятой может быть lvalue (§5.16, §5.17, § 5.18).
§C1.5 Заявления.
В настоящее время недопустимо переходить через объявление с явным или неявным инициализатором (кроме всего блока, не введенного) (§6.4.2, §6.6.4)
Теперь недействительно возвращать (явно или неявно) из функции, объявленной для возврата значения без фактического возврата значения (§6.6.3).
§C.1.6 Объявления.
В С++ спецификаторы static
или extern
могут применяться только к именам объектов или функций. Использование этих спецификаторов с объявлениями типов является незаконным в С++ (§7.1.1).
Имя С++ typedef
должно отличаться от имени класса, объявленного в той же области
(за исключением того, что typedef
является синонимом имени класса с тем же именем) (§7.1.3).
const
объекты должны быть инициализированы в С++, но могут быть оставлены неинициализированными в C (§7.1.6).
Неявный int
в С++ (§7.1.6).
Ключевое слово auto
не может использоваться в качестве спецификатора класса хранения (§7.1.6.4).
Объектам типа С++ типа С++ могут присваиваться только значения одного и того же типа перечисления (§7.2).
В С++ тип перечислителя - это его перечисление (§7.2).
§C.1.7 Деклараторы.
В С++ функция, объявленная с пустым списком параметров, не принимает аргументов ($ 8.3.5).
В С++ типы не могут быть определены в обратном или параметрическом типах (§8.3.5, п. 5.3.3).
В С++ синтаксис определения функции исключает функцию "старого стиля" C (§8.4).
В С++ при инициализации массива символа с строкой количество символов в строке (включая завершающий '\0'
) не должно превышать число элементов в массиве (§8.5.2).
§C.1.8 Классы.
В С++ объявление класса вводит имя класса в область, где оно объявлено и скрывает любой объект, функцию или другое объявление этого имени в охватывающей области (§9.1, §7.1.3).
В С++ имя вложенного класса является локальным для его охватывающего класса (§9.7).
В С++ имя typedef
не может быть переопределено в определении класса после использования в этом определении (§9.9).
§C1.9 Специальные функции-члены.
Неявно объявленный конструктор копирования и неявно объявленный оператор присваивания копии не может сделать копию volatile
lvalue (§12.8).
§C1.10 Директивы предварительной обработки.
Определен ли __STDC__
, и если да, то каково его значение, определены реализацией (§16.8).
Чтобы облегчить регенерацию сравнительной таблицы ключевых слов и создать уверенность в том, что указано, здесь используется программа С++ для ее создания:
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
#define ITEMS_OF( c ) c.begin(), c.end()
enum class Language { c, cpp };
auto compare( Language const a, Language const b )
-> int
{ return int( a ) - int( b ); }
struct Keyword
{
string word;
Language language;
friend
auto operator<( Keyword const& a, Keyword const& b )
-> bool
{
if( int const r = a.word.compare( b.word ) ) { return (r < 0); }
return (compare( a.language, b.language ) < 0);
}
};
void add_words_from(
string const& filename, Language const language, vector< Keyword >& words
)
{
ifstream f( filename );
string word;
while( getline( f, word ) )
{
words.push_back( Keyword{word, language} );
}
}
auto main() -> int
{
vector< Keyword > words;
add_words_from( "kwc.txt", Language::c, words );
add_words_from( "kwcpp.txt", Language::cpp, words );
sort( ITEMS_OF( words ) );
int const w = 20;
int previous_column = -1;
string previous_word = "";
cout << left;
for( Keyword const& kw : words )
{
int const column = (int) kw.language;
int const column_advance = column - (previous_column + 1);
if( column_advance < 0 || previous_word != kw.word )
{
cout << endl;
if( column > 0 ) { cout << setw( w*column ) << ""; }
}
else
{
cout << setw( w*column_advance ) << "";
}
cout << setw( w ) << kw.word;
previous_column = column; previous_word = kw.word;
}
cout << endl;
}
Ответ 7
Шаблоны - еще одна большая разница (в дополнение к классам/объектам). Шаблоны включают, например, типы стандартных типов контейнеров (их первый вариант использования) и (бастардованные) лямбда-выражения (boost::lambda
).
С++ - гораздо больший язык (не только библиотека), чем C.
Ответ 8
Этот вопрос не имеет короткого ответа.
В целом поддержка С++:
- парадигма ООП,
- generic programminng;
- метапрограммирование матрицы;
- Абстрактные типы данных;
- Новые библиотеки и стандартные элементы поддержки функциональной парадигмы,
- другие инструменты для обеспечения максимальной поддержки вашей программы;
- Также вы можете писать программы в стиле C, но использовать компилятор С++.
Но чистый C - немного быстрее, чем С++ и более низкий уровень.
Ответ 9
Другая функция С++ имеет над C обработку исключений в виде throw... catch.
Ответ 10
С++ намного больше, чем C с классами. Существует много других концепций внутри С++, таких как шаблоны, перегрузка функций и операторов, исключения и многие другие, упомянутые здесь. Это делает С++ очень мощным и гибким, но также трудным для изучения. Это не то, что единые понятия трудно понять, а их сумма и то, как они играют вместе. Взгляните на повышение, чтобы увидеть, что все возможно сделать с С++. И я догадываюсь, что потребовалось много времени, чтобы понять, что происходит под капотом, что очень ясно в случае C.
Или вкратце: С++ намного больше, чем C с классами, или, другими словами, С++ намного больше, чем Java плюс управление памятью.
Ответ 11
В 1-й из 2-х частей С++ для программистов на C перечислены некоторые отличия, отличные от OOP:
- Аргументы по умолчанию для функций
- Перегрузка функций
- Вы можете объявлять локальные переменные везде, где они нужны, а не только в начале функции (также функция C99)
- Ссылки, как в
int& x
- Const-correctness вообще
- Пространство имен
- Встроенный логический тип
bool
, с ключевыми словами true
и false
(также на C99 через stdbool.h) - Входящее ключевое слово и связанные с ним причуды, включая неявное вложение и автоматическое вложение
- Значительно большая стандартная библиотека, чем C