C/C++
Самые значительные различия С и С++ ( Кроме наличия ООП )
Самые значительные различия С и С++ ( Кроме наличия ООП )
шаблоны, пространства имен, исключения, перегрузка операторов, автоматический вывод типа выражения, константные выражения, вычисяемые во время компиляции, ссылки, лямбды, возможность создать пользовательскую ошибку компиляции, умные указатели.
Когда речь идёт о различии языков, то следует отличать реализации на самом языке, к которым относится стандартная библиотека. Например исключения – это библиотечные шаблоны, определённые в пространстве имён std::exception, а пользовательские исключения являются наследниками базового библиотечных классов. А это уже ООП по определению. И так о различиях.
Объявление и реализация типов, включая базовые:
int n = int();
n += 10;
for (int i = 0; i < n; ++i) { ; }
Встроенный булевой тип:
bool a = true;
bool b = false;
Константность:
const size_t n = 10;
int box[n];
Перегрузка функций:
void fn() { ; }
void fn(int x) { ; }
Передача и возвращение параметров по ссылкам:
void pow2(double& x) { x *= x; }
const int& fn(int& x, int y) { return x += y; }
Выделение и освобождение памяти в куче и nullptr
size_t n = 15;
int* ptr = new int[n];
delete[] ptr;
ptr = nullptr;
Пространства имён: namespace
Объявления: using
using namespace std;
using ullong_t = unsigned long long;
Шаблоны функций:
template<typename T> T fn(T x) { return x *= x; }
Объявление и реализация типов, включая базовые:
int n = int();
n += 10;
for (int i = 0; i < n; ++i) { ; }
Встроенный булевой тип:
bool a = true;
bool b = false;
Константность:
const size_t n = 10;
int box[n];
Перегрузка функций:
void fn() { ; }
void fn(int x) { ; }
Передача и возвращение параметров по ссылкам:
void pow2(double& x) { x *= x; }
const int& fn(int& x, int y) { return x += y; }
Выделение и освобождение памяти в куче и nullptr
size_t n = 15;
int* ptr = new int[n];
delete[] ptr;
ptr = nullptr;
Пространства имён: namespace
Объявления: using
using namespace std;
using ullong_t = unsigned long long;
Шаблоны функций:
template<typename T> T fn(T x) { return x *= x; }
Стандартная библиотека
Особо никакой разницы, ибо С++ стабильно всё ворует (пардон, "обновляет") из стандартных библиотек Си и GNU Си :))
Не знаю насколько такие различия значительны, но то, что они сразу бросаются в глаза - это точно!
Первые же команды препроцессора разные.
B Си:
#include <stdio.h>
#include <math.h>
В Си++:
#include <iostream>
#include <cmath>
В плюсах есть пространство имён, например:
using namespace std;
А где оно в чистом Си?
Динамические массивы в Си и плюсах создаются и уничтожаются по разному. В плюсах это new/delete, а никакие не маллок/фри.
Даже функции из одного модуля (c)math работают по разному: в плюсах берёшь модуль вещественного числа abs(x) и никаких проблем не возникает, а в Си для этого обязательно нужен какой-то fabs. Зато форматный вывод в Си мне больше нравится, он даже из Си в Питон перекочевал!
И ещё: в плюсах подсистема Си работает. Вот возьму на С++ да напишу:
#include <stdio.h>
int main()
{ int a, b; printf("a b : "); scanf("%d%d", &a,&b); printf("%d × %d = %d",a,b,a*b); return 0; }
И всё будет работать. А попробуй в системе программирования на чистом Си написать что-то на плюсах и сразу всё застопорится.
Первые же команды препроцессора разные.
B Си:
#include <stdio.h>
#include <math.h>
В Си++:
#include <iostream>
#include <cmath>
В плюсах есть пространство имён, например:
using namespace std;
А где оно в чистом Си?
Динамические массивы в Си и плюсах создаются и уничтожаются по разному. В плюсах это new/delete, а никакие не маллок/фри.
Даже функции из одного модуля (c)math работают по разному: в плюсах берёшь модуль вещественного числа abs(x) и никаких проблем не возникает, а в Си для этого обязательно нужен какой-то fabs. Зато форматный вывод в Си мне больше нравится, он даже из Си в Питон перекочевал!
И ещё: в плюсах подсистема Си работает. Вот возьму на С++ да напишу:
#include <stdio.h>
int main()
{ int a, b; printf("a b : "); scanf("%d%d", &a,&b); printf("%d × %d = %d",a,b,a*b); return 0; }
И всё будет работать. А попробуй в системе программирования на чистом Си написать что-то на плюсах и сразу всё застопорится.
в плюсах по идее оверхед по памяти есть, и он немаленький; да и боилерплейт кода там хватает
Namespacы, templatы, reinterpret_cast и т. п., перегрузка функций, лямбда-функции, отсутствие утечек памяти на каждой компиляции, максимум какой-нибудь std::bad_alloc из за того что указал индекс в векторе, в котором меньше элементов, чем этот индекс. Красота короче. Если про классы не говорить, то это наверное всё. Разве что ещё тип данных строка, которую не надо реаллочить вручную и богатая std, у Си намного меньше
Похожие вопросы
- Лабораторка по ООП
- Помогите с ООП на C++
- Вопрос к экзамену по ООП.
- Вопрос по ООП на С++
- Лютый препод не унимается. Просит без ООП написать функцию обмена значениями переменных любого типа!
- Архитектурные трабблы при использовании ООП
- Тип треугольника ООП
- Создать метод который выводит все спектакли и дать их прохождения, которые состоятся в заданный день недели ООП
- Правда ли, что язык Си - это язык мертвый и никому не нужный, а Си++ - это кривое костыльное ООП, которое скоро умрет?
- Найдите сумму, разность и скалярное произведение двух векторов в N-мерном пространстве. Язык С++ ООП