Чем C++ отличается от C
Коротко: почти всё, что есть в C, есть и в C++ — те же типы, if, циклы, функции, указатели, printf и scanf. Сверху C++ добавил классы, ссылки, перегрузку, шаблоны и большую стандартную библиотеку: строки string, массивы vector, готовые сортировки, множества и словари.
C++ вырос из C: его автор Бьёрн Страуструп начал в 1979 году с языка «C с классами», а имя C++ появилось в 1983 году. Сейчас это два разных языка со своими стандартами.
Что есть в C++ и нет в C
| Возможность | C | C++ |
|---|---|---|
Классы, конструкторы, public/private | нет | есть |
Ссылки int& | нет, только указатели | есть |
| Перегрузка функций (одно имя — разные параметры) | нет | есть |
Шаблоны (template) | нет | есть |
Пространства имён (namespace, std::) | нет | есть |
Исключения (try, catch) | нет | есть |
| Строки | массив char и функции <string.h> | класс string |
| Динамические массивы | malloc и free | vector, new и delete |
| Сортировка, множества, словари | qsort, остальное — самому | STL: sort, set, map |
| Ввод-вывод | printf, scanf | cout, cin (и printf тоже) |
Шаблоны — функции и классы, написанные один раз для любого типа данных (так устроен vector<int>, vector<string>). Исключения — способ сообщить об ошибке и обработать её в другом месте программы. Пространство имён — общая приставка для имён одной библиотеки: у стандартной это std::. STL — стандартная библиотека шаблонов C++.
Одна и та же задача — прочитать числа и вывести их по возрастанию — на C++ решается в несколько строк:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int& x : a) {
cin >> x;
}
sort(a.begin(), a.end());
for (int x : a) {
cout << x << " ";
}
cout << "\n";
return 0;
}4
3 1 4 21 2 3 4На C понадобятся malloc для массива нужной длины, своя функция сравнения для qsort и free в конце.
Где код на C не собирается как C++
Большая часть программ на C собирается и компилятором C++, но не все:
int* a = malloc(n * sizeof(int));— в C можно, в C++ нужно явное приведение(int*)malloc(...): C++ строже к преобразованиям типов указателей;- слова
class,new,delete,template,thisв C — обычные имена переменных, а в C++ — служебные слова; - массив переменной длины
int a[n]появился в стандарте C99, а в стандарт C++ не входит. g++ собирает его как своё расширение, Visual Studio — нет; - символ
'a'в C имеет типint, а в C++ —char. На обычные программы это почти не влияет.
Что учить первым
Знать C перед C++ не обязательно: курс C++ начинается с нуля. Для олимпиад и большинства прикладных задач удобнее C++ — со стандартной библиотекой многое уже готово. Язык C стоит выбрать, если цель — микроконтроллеры, ядро операционной системы или код, который должен собираться самыми простыми компиляторами. Прошлые знания при этом не пропадут: синтаксис у языков общий, и переход в любую сторону даётся легко.
Сам язык C — в теме C. Микроконтроллеры Arduino программируют на языке, основанном на C++, — тема Arduino.