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

Его конструкция подчиняется комплексу правил:
- Он определяется в соответствии с возникающими проблемами и немедленно на него реагирует.
- Важнее привнести способности, чем не допустить неправильного использования языка.
- Созданные пользователем типы являются такими же быстродействующими, как и заданные.
- Производительность не наказывается ненужными функциями.
- Между C++ и родным кодом не должно быть промежуточного языка.
Первый стандарт ISO для языка C++ датируется 1998 годом, это C++ 98. Его преемником стала новая версия в 2011 году - C++ 11. С этой версией, которая ничего не приносит, когда читаемость и современность, язык закрепляется в его роли системного инструмента, от которого он был отвлекен какое-то время.
Растущая сложность C++ с версиями 11, 14 и т. Д. критиковали, в частности, Дональд Кнут и Эдсгер Дейкстра. Самого конструктора не устраивают функции, добавленные за время к синтаксису языка, и он как-то намекает на историю «Васы» - шведской лодки, к которой добавилось столько всего, что она тонула с первых метров. Бьарне Струструп :
Внутри C++ есть более простой и понятный язык, который борется за появление.
C++ используется в качестве языка приложений благодаря графическим интерфейсам вроде Qt и GTK или с 3D-двигателями вроде Unreal Engine. Понятно, что он был разработан для оптимизации производительности компьютера и уж точно не производительности программиста. Ошибки, неизбежно происходящие с его хард-ядреным и мало читаемым синтаксисом, дорого окупаются за время отладки. Используется там, где это уместно, для системных инструментов, он обеспечивает неоспоримые преимущества для C, такие как RAI, о которых будет сказано ниже.
Пример кода: Отображение символов строки.
string s = "demo" + "suffixe";
int l = s.length();
for(int i = 0; i < l; i++) {
char c = s[i];
printf("%c\n", c);
}
Краткая история языка
-
В
- 1979 году Бьарне Струструп готовит диссертацию на соискание степени доктора компьютерных наук и открывает Симулу 67.
- Затем он начинает работать над языком под названием C с классами. Цель - воспользоваться быстротой и переносимостью C, добавив к нему ориентацию на объект. В
- 1981 году язык добавляет к C классы, наследование, встроенные функции, аргумент по умолчанию к функциям. Его компилятор называется CFrong, но он просто переводит код в C. В
- 1983 году язык переименован в C++. Поддерживает виртуальные функции, перегруженность элементов, ссылки с &, постоянные методы, символ//для комментария строки. В
- 1985 году выходит первая книга, описывающая язык: «Язык программирования C++». В
- 1989 году добавляются статические и защищённые члены, множественное наследство. В
- 1990 году появляется компилятор Turbo C++ (от Борланда) в сопровождении важнейших библиотек. В
- 1998 году определен первый стандарт ISO.
- Затем добавляются шаблоны, исключения, пространства имен, тип bool. В
- 2003 году стандарт был пересмотрен . В
- 2011 году после 6 лет работы и задержек появляется новый стандарт. Он добавляет цикл для in, конкуренция, динамические переменные со словом auto. В
- 2014 году запланирован новый стандарт ISO .
Формализованные объекты действия
C++ описывает классы в заголовочных файлах, а тело методов - в исходных. Объявляя экземпляры классов, можно повторно использовать наборы переменных и методов, не объявляя их повторно.
Перегруженность функций позволяет объявлять их с разными параметрами, но с одним и тем же именем.
Классы наследуют друг от друга и делятся своими методами. Многогранное наследие у него само по себе, это не было принято в производных языках.
С течением времени определение структуры эволюционировало таким образом, что оно становится эквивалентом определения класса и отличается тем, что структура по умолчанию является общедоступной, а класс по умолчанию является частным. Структуры могут быть наделены методами и поддерживать наследие, и на самом деле можно обойтись без классов полностью в предметно-ориентированной программе.
Эту концептуальную модель критикует Тригве Ренскауг, изобретатель MVC и ИНН, который считает её слишком статичной и мало подходящей для реальности обработки, для которой представление объектов должно меняться в зависимости от контекста. Но этот недостаток разделяют все текущие предметно-ориентированные языки, кроме, возможно, таких, как Go, которые заменяют наследство композицией.
Управление памятью
C++ ввел RAI (Resource Acquision Is Initialization), принцип, согласно которому при создании объекта и, следовательно, области памяти он будет автоматически освобожден при уничтожении объекта. Это освобождает от сбора и свободного обучения языку С.
Ресурс может быть объектом, классом, экземпляром файла. Ее объявляют в скопе и выпускают, когда ты выходишь из скопа.
C++ 11
Новый язык C++ улучшается, рассказывает нам его создатель Бьарне Струструп по трем планам:
- Язык.
- Стандартная библиотека.
- Конкуренция.
Определение стандарта было одобрено 25 марта 2011 года комитетом C++ ISO.
Теперь для строк символов поддерживается внутренний формат UTF-8.
Новые типы и ключевые слова
- машина
Тип переменной определяется назначенным образом.
Пример :vector<string> v = {"Alicia", "Bea", "Clara", "Dara" }; for (auto x : v) cout << x <<'\n';
- константа
Постоянное выражение. - nullptr
Слово, зарезервированное для нулевого указателя.
Например:
char *x = nullptr;
- строковый буквенный сырец (raw string).
Строки, в которых коды выпуска не интерпретируются, например, в простых кавычках в PHP.
Они имеют приставку R. - деклтайп
Способ использования типа в выражении, возвращает тип и редакторы любого объекта, включая функцию. - Литералы UTF 8
u8 «Любой текст».
Используется u для UTF16 и U для UTF 32.
Безопасность для типов
- Управление выравниванием значений.
- Управление значениями по умолчанию.
Новое строительство
Петля для одного интервала.
Как и реализовано на большинстве скриптовых языков.
int arr[5] = {2, 8, 21, 56, 995};
for (int &x : arr) {
printf("%d\n", x);
}
Как видно, язык сохраняет принцип минимального исходного кода. Он не использует ключевое слово in так, как это делают большинство языков, а скорее является символом.
Традиция, которая родилась в то время, когда мы экономили каждый символ, чтобы уменьшить размер кода! Память дорого обошлась в 1972 году...
Лямбда-функция.
Функции, определенные и используемые на месте, контекстуально и эфемерно.
rvalue
Это способ ссылки на содержимое переменной, при котором содержимое B присваивается A, не копируя его, но перемещая указатель на содержимое, в перспективе или B больше не используется.
Модель «вариадик».
Шаблон с переменным числом аргументов.
Статическое утверждение
Введенная с ключевым словом static_assert, она проверяет действительность утверждения при компиляции.
Типичное перечисление и область
Классы
Делегирование и наследие строителей. Конструктор класса может вызвать конструктора других классов.
Атрибуты класса могут быть назначены непосредственно в определении класса.
Стандартная библиотека
Появляются новые объекты, ставшие привычными в языках скриптов, таких как PHP.
- regexp
Регулярные выражения - кортеж
Специфический для языка Python. - массив
Статическая таблица. - unordered_map
Стол ожидания. - дата.
- умный указатель
Умный указатель ;
Плюс различные компоненты библиотек и улучшения. Например, теперь можно статически назначить список вектору в его заявлении.
Конкуренция
Несколько потоков с общей памятью легко использовать. Мы создаем функцию и вызываем ее с помощью указателя функции с помощью команды thread...
#include <thread>
void f(int a) {
... code...
}
int main() {
...
thread t(&f, 1000);
t.join();
...
}
Команда join () запускает поток.
Асинхронная команда вызывает функцию в асинхронном режиме, что стало знакомо с Ajax.
Особенности конкуренции под C++ 11 :
- Модель памяти для современных компьютеров с многоядерными процессорами.
- Поток ABI.
- Атомные типы.
- Мутексы и замки.
- Локальное хранилище потоков .
- Асинхронный обмен сообщениями.
Инструменты и документы
- Нет, Маке. Компиляция проекта C++ без макефила.
- Visual C++. Visual Studio Community от Microsoft. IDE бесплатно для разработки с .NET. или без него.
- Qt Creator. Многоплатформенная IDE на основе платформы Qt. Встроен редактор графического интерфейса (нажмите на .ui-файлы).
- Затмение. Графический интерфейс разработки и интегратор инструментов с плагином для C++. (Java).
- МинВт. Это версия для Windows от GCC, бесплатного компилятора Free Software Fundation.
- CLang. Компилятор C, C++ и Objective C быстродействующий, фронтмен LLVM, создающий портативный промежуточный код, который можно преобразовать в бинарный или JavaScript .
- Клинг. Интерпретатор для C++, использующий JIT. Очень полезный инструмент для изучения языка или выполнения скриптов .
- C to C++. Преобразует проект из C в C++. (Python 2)
- Бост. Библиотеки с открытым исходным кодом для C++ .
Objective C - версия С, ориентированная на объект, более простая в использовании, чем C++. GnuStep - среда разработки для Linux и Windows.
Безопасность
C++ - это язык, дающий программистам полную свободу, но это не безопасный язык. Агентство национальной безопасности США не рекомендует использовать его из-за возможных уязвимостей при использовании памяти. Недовольные могли использовать недостатки, которые появляются с гибким языком. Когда безопасность важна, организации должны будут использовать другие языки, такие как C #, Go, Java, Swift или даже Rust для мазохистов.
Читайте также: Кандидаты-преемники C++ .