C++, быстрый системный язык и приложения

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

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

Langage de programmation C++ pour systèmes

Его конструкция подчиняется комплексу правил:

Первый стандарт 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);
} 

Краткая история языка

Формализованные объекты действия

C++ описывает классы в заголовочных файлах, а тело методов - в исходных. Объявляя экземпляры классов, можно повторно использовать наборы переменных и методов, не объявляя их повторно.
Перегруженность функций позволяет объявлять их с разными параметрами, но с одним и тем же именем.

Классы наследуют друг от друга и делятся своими методами. Многогранное наследие у него само по себе, это не было принято в производных языках.
С течением времени определение структуры эволюционировало таким образом, что оно становится эквивалентом определения класса и отличается тем, что структура по умолчанию является общедоступной, а класс по умолчанию является частным. Структуры могут быть наделены методами и поддерживать наследие, и на самом деле можно обойтись без классов полностью в предметно-ориентированной программе.

Эту концептуальную модель критикует Тригве Ренскауг, изобретатель MVC и ИНН, который считает её слишком статичной и мало подходящей для реальности обработки, для которой представление объектов должно меняться в зависимости от контекста. Но этот недостаток разделяют все текущие предметно-ориентированные языки, кроме, возможно, таких, как Go, которые заменяют наследство композицией.

Управление памятью

C++ ввел RAI (Resource Acquision Is Initialization), принцип, согласно которому при создании объекта и, следовательно, области памяти он будет автоматически освобожден при уничтожении объекта. Это освобождает от сбора и свободного обучения языку С.
Ресурс может быть объектом, классом, экземпляром файла. Ее объявляют в скопе и выпускают, когда ты выходишь из скопа.

C++ 11

Новый язык C++ улучшается, рассказывает нам его создатель Бьарне Струструп по трем планам:

  1. Язык.
  2. Стандартная библиотека.
  3. Конкуренция.

Определение стандарта было одобрено 25 марта 2011 года комитетом C++ ISO.
Теперь для строк символов поддерживается внутренний формат UTF-8.

Новые типы и ключевые слова

  1. машина
    Тип переменной определяется назначенным образом.
    Пример :
    vector<string> v = {"Alicia", "Bea", "Clara",  "Dara" };
    for (auto x : v) cout << x <<'\n';
  2. константа
    Постоянное выражение.
  3. nullptr
    Слово, зарезервированное для нулевого указателя.
    Например:
    char *x = nullptr;
  4. строковый буквенный сырец (raw string).
    Строки, в которых коды выпуска не интерпретируются, например, в простых кавычках в PHP.
    Они имеют приставку R.
  5. деклтайп
    Способ использования типа в выражении, возвращает тип и редакторы любого объекта, включая функцию.
  6. Литералы UTF 8
    u8 «Любой текст».
    Используется u для UTF16 и U для UTF 32.

Безопасность для типов

  1. Управление выравниванием значений.
  2. Управление значениями по умолчанию.

Новое строительство

Петля для одного интервала.
Как и реализовано на большинстве скриптовых языков.

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.

  1. regexp
    Регулярные выражения
  2. кортеж
    Специфический для языка Python.
  3. массив
    Статическая таблица.
  4. unordered_map
    Стол ожидания.
  5. дата.
  6. умный указатель
    Умный указатель
  7. ;

Плюс различные компоненты библиотек и улучшения. Например, теперь можно статически назначить список вектору в его заявлении.

Конкуренция

Несколько потоков с общей памятью легко использовать. Мы создаем функцию и вызываем ее с помощью указателя функции с помощью команды thread...

#include <thread>

void f(int a) {
  ... code...
}

int main() {
  ...
  thread t(&f, 1000);
  t.join();
  ...
}

Команда join () запускает поток.
Асинхронная команда вызывает функцию в асинхронном режиме, что стало знакомо с Ajax.

Особенности конкуренции под C++ 11 :

  1. Модель памяти для современных компьютеров с многоядерными процессорами.
  2. Поток ABI.
  3. Атомные типы.
  4. Мутексы и замки.
  5. Локальное хранилище потоков .
  6. Асинхронный обмен сообщениями.

Инструменты и документы

Objective C - версия С, ориентированная на объект, более простая в использовании, чем C++. GnuStep - среда разработки для Linux и Windows.

Безопасность

C++ - это язык, дающий программистам полную свободу, но это не безопасный язык. Агентство национальной безопасности США не рекомендует использовать его из-за возможных уязвимостей при использовании памяти. Недовольные могли использовать недостатки, которые появляются с гибким языком. Когда безопасность важна, организации должны будут использовать другие языки, такие как C #, Go, Java, Swift или даже Rust для мазохистов.

Читайте также: Кандидаты-преемники C++ .