«rvalue» (сокращение от «right-hand value» или «что находится справа от оператора присваивания») — это выражение, которое может быть использовано только в правой части оператора присваивания или в контекстах, где ожидается значение, которое временно или по определению не может быть изменено. Rvalue не имеет имени или идентификатора, и после использования оно может быть уничтожено.
std::make_shared — это функция, определенная в заголовочном файле <memory>, которая используется для создания объектов в динамической памяти с использованием умных указателей std::shared_ptr.
Преимущество std::make_shared заключается в том, что она создает объект и управляющий блок (control block), содержащий метаинформацию и счетчик ссылок, в одном куске памяти. Это может улучшить производительность и уменьшить использование памяти по сравнению с созданием объекта и управляющего блока отдельно с использованием std::shared_ptr.
Инлайн-функции представляют собой специальный тип функций, который компилятор старается вставить непосредственно в код вызывающей функции вместо осуществления обычного вызова. Это сделано для увеличения производительности за счет сокращения накладных расходов на вызов функции.
При использовании ключевого слова inline вы даете компилятору рекомендацию включить функцию непосредственно в код места вызова, но компилятор всегда оставляет за собой право игнорировать эту рекомендацию, особенно если функция слишком сложная или встречается во множестве мест.
«Ленивые вычисления» — это подход в программировании, при котором вычисления выполняются только в случае необходимости, то есть когда результат действительно требуется для продолжения выполнения программы. Это может быть полезным для оптимизации работы с большими объемами данных или сложными вычислениями, когда не хочется тратить ресурсы на вычисления, которые могут оказаться ненужными.
Указатель на функцию в C++ представляет собой переменную, которая хранит адрес функции. Это позволяет вызывать функции через указатель и передавать их как аргументы другим функциям.
Указатели на функции могут быть использованы для создания таблиц функций, динамической загрузки библиотек, а также для реализации различных паттернов программирования, таких как обратный вызов (callback) и динамическое определение функциональности.
Позднее связывание (или динамическое связывание) — это концепция в C++, которая связывает вызов метода с его реализацией во время выполнения программы, а не на этапе компиляции. Это позволяет достичь полиморфизма и инкапсуляции, так как объекты могут вызывать методы, которые будут разрешены на основе их фактического типа, а не только статического типа.
В C++ позднее связывание реализуется с помощью виртуальных функций и ключевого слова virtual. Виртуальные функции определяются в базовом классе и могут быть переопределены в производных классах. Когда вы вызываете виртуальную функцию через указатель или ссылку на базовый класс, вызывается соответствующая реализация в производном классе на основе реального типа объекта.
Имплементация означает создание кода, который реализует определенную функциональность или алгоритм на конкретном языке программирования. Это процесс написания программного кода, который осуществляет определенное поведение, описанное в спецификации или дизайне.
В C++ «имплементация» означает написание кода, который реализует методы, функции или классы, описанные в заголовочных файлах (header files). Заголовочные файлы содержат объявления (прототипы) функций и классов, а файлы с исходным кодом (.cpp) содержат реализацию этих функций и методов.
Виртуальное наследование — это механизм, который позволяет решать проблемы, связанные с алмазной проблемой (diamond problem), которая возникает, когда один класс наследуется от двух классов, которые в свою очередь имеют общий базовый класс. В такой ситуации может возникнуть неоднозначность, какой именно метод или данные выбрать из общего базового класса.
Виртуальное наследование решает эту проблему путем создания единственного экземпляра общего базового класса для всех классов, которые наследуют его. Это гарантирует, что не будет создано несколько копий общих данных и методов при множественном наследовании. Виртуальное наследование применяется с использованием ключевого слова virtual перед базовым классом в объявлении наследования.
В C++, поля класса (также называемые членами класса или атрибутами) могут быть инициализированы через конструкторы класса. Конструкторы - это специальные методы класса, которые вызываются при создании объекта этого класса и могут использоваться для установки начальных значений его полей.
Инициализация полей через конструкторы является хорошей практикой, так как она позволяет установить начальные значения полей объекта сразу при его создании, обеспечивая более надежное и читаемое поведение программы.
struct — это конструкция, которая позволяет объединить несколько переменных разных типов под одной общей структурой. Она предоставляет способ создания пользовательских типов данных, которые могут содержать различные поля или члены.
Структуры могут использоваться для создания более сложных типов данных, объединяя несколько переменных в одну единицу. Важно отметить, что структуры по умолчанию имеют общий доступ к своим полям (публичные поля), и их поля можно модифицировать напрямую.
Сериализация — это процесс преобразования данных, таких как объекты, структуры или контейнеры, в последовательность байтов, чтобы их можно было сохранить или передать через сеть, а затем восстановить обратно в исходное состояние. Это позволяет сохранять состояние программы или обмениваться данными между разными программами или системами.
Сериализация имеет большое значение, например, когда вы хотите сохранить состояние вашего приложения для долгосрочного хранения или передать данные между клиентом и сервером в распределенной системе. Она позволяет избежать необходимости ручного форматирования данных для записи и их последующего разбора.
Явное приведение типов (или явное преобразование типов) — это процесс, при котором программист явно указывает компилятору, что нужно выполнить преобразование значения из одного типа данных в другой. Это может быть полезно, когда нужно убедиться, что данные корректно преобразуются между типами, даже если это может потенциально привести к потере информации или изменению значения.
std::mutex (мьютекс) — это часть стандартной библиотеки C++, предназначенная для обеспечения многопоточной синхронизации. Мьютексы используются для предотвращения одновременного доступа нескольких потоков к общему ресурсу, такому как переменная или участок кода, который должен выполняться атомарно (без прерывания другими потоками).
Однако следует быть осторожным при использовании мьютексов, так как неправильное управление ими может привести к проблемам с блокировкой и даже к взаимоблокировкам (deadlock).
SFINAE («Substitution Failure Is Not An Error»), что в переводе с английского означает «Отказ от подстановки — не ошибка». Это концепция и механизм, которые позволяют компилятору избежать ошибок компиляции при попытке подстановки шаблонов с некорректными типами аргументов. Вместо того чтобы считать такую ситуацию ошибкой и прекращать компиляцию, SFINAE позволяет компилятору просто исключить неподходящие специализации шаблона из рассмотрения.
Это достигается путем проверки, является ли выражение, связанное с подстановкой параметров шаблона, корректным в контексте, где происходит инстанцирование. Если выражение некорректно (например, вызывает ошибку компиляции), то компилятор просто пропускает данную специализацию шаблона и продолжает рассматривать другие альтернативы.
Const correctness — это практика написания кода таким образом, чтобы правильно использовать ключевое слово const для обозначения неизменяемости (константности) данных и гарантировать, что эта константность сохраняется во всем коде. Это позволяет улучшить читаемость кода, облегчить его понимание и предостеречь от некоторых типичных ошибок.
Ключевое слово const может быть применено к разным элементам, таким как переменные, указатели, методы классов и аргументы функций.
Корректное использование const позволяет компилятору проводить дополнительные проверки на этапе компиляции, что помогает предотвратить случайные изменения данных, обеспечивая безопасность и надёжность кода.
vptr означает «virtual pointer» (виртуальный указатель) и является частью механизма виртуальных функций и полиморфизма.
Когда класс содержит хотя бы одну виртуальную функцию, компилятор добавляет в этот класс скрытый указатель, который называется vptr. Этот указатель указывает на таблицу виртуальных функций, которая называется «таблицей виртуальных функций» или «vtable». В этой таблице содержатся указатели на реализации виртуальных функций для данного класса и всех его производных классов.
dynamic_cast — это оператор, который используется для выполнения безопасного приведения типов в иерархии классов во время выполнения программы. Основное назначение dynamic_cast заключается в том, чтобы проверить, можно ли безопасно привести указатель или ссылку на базовый класс к указателю или ссылке на его производный класс.
Оператор dynamic_cast применяется преимущественно в контексте полиморфизма, когда у вас есть иерархия классов с виртуальными функциями, и вы хотите выполнить динамическое приведение типов среди объектов этой иерархии.
Директива define используется для создания макросов, которые позволяют вам задавать символьные константы или небольшие фрагменты кода, которые будут заменены компилятором на определенное значение или код перед компиляцией программы. Это представляет собой форму текстовой подстановки.
Следует помнить, что использование макросов может иметь как положительные, так и отрицательные стороны. Они могут улучшить читаемость и обслуживаемость кода, но также могут привести к неожиданным проблемам, таким как ошибки из-за неправильной обработки аргументов макроса или проблемы с пространством имен. В C++ также есть более современные способы достижения тех же целей, такие как константы и inline функции, которые иногда предпочтительнее использовать вместо макросов.
static_assert — это механизм в C++, который позволяет выполнять проверки на этапе компиляции для статических условий. Он был добавлен в стандарт C++11 и предоставляет способ проверки, что определенное условие истинно во время компиляции. Если условие ложно, компиляция завершится ошибкой.
Встраиваемые функции (inline functions) представляют собой специальный механизм оптимизации, который позволяет компилятору вставлять код функции непосредственно в место её вызова, вместо фактического вызова функции. Это может уменьшить накладные расходы на вызов функции и улучшить производительность программы, особенно для небольших функций.