Различие локальной переменной и поля класса с одинаковым именем
Указатель this может быть полезен в случае, когда локальная переменная в методе имеет то же самое имя, что и поле объекта:
Здесь в методе set мы присваиваем полю класса x значение локальной переменной this. Чтобы различить поле класса x и локальную переменную с тем же именем мы используем запись this->x при обращении к полю класса.
Указатель this может быть полезен в случае, когда локальная переменная в методе имеет то же самое имя, что и поле объекта:
void set(int x) { this->x = x; }
Здесь в методе set мы присваиваем полю класса x значение локальной переменной this. Чтобы различить поле класса x и локальную переменную с тем же именем мы используем запись this->x при обращении к полю класса.
#вопросы_с_собеседований
Что случится, если exception выйдет за пределы потока?
Если exception выходит за пределы потока, то оно не может быть обработано на текущем уровне, т. к. он уже завершен. В таком случае исключение будет зарегистрировано как неперехваченное и может привести к аварийному завершению программы.
Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан.
Что случится, если exception выйдет за пределы потока?
Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан.
execution policy для параллельных алгоритмов
Execution policy в C++ - это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно.
Существуют три варианта execution policy:
-
-
-
Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как
Execution policy в C++ - это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно.
Существуют три варианта execution policy:
-
seq
: выполняет алгоритм последовательно.-
par
: выполняет алгоритм параллельно, используя все доступные ядра процессора.-
par_unseq
: выполняет алгоритм параллельно и может использовать неупорядоченное исполнение.Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как
std::for_each
, std::transform
, std::reduce
и другими. Например, код выше выполняет алгоритм std::for_each
параллельно.Проверить, найден ли элемент в массиве С++
В С++ вы должны использовать std::find и проверить, указывает ли результирующий указатель на конец диапазона.
#вопросы_с_собеседований
В С++ вы должны использовать std::find и проверить, указывает ли результирующий указатель на конец диапазона.
#вопросы_с_собеседований
•
В C++ имя функции пользовательских операторов — это сам символ оператора.•
Унарные и бинарные операторы (- и -) различаются по количеству аргументов.•
Унарные операторы инкремента и декремента (++, --) имеют одинаковую сигнатуру.•
Для различия постфиксных операторов ++ и -- используется фиктивный аргумент int.•
Постфиксные операторы ++ и -- принимают фиктивный аргумент int как флаг для компилятора.Please open Telegram to view this post
VIEW IN TELEGRAM
•
C++ позволяет вызывать статические методы из экземпляра таким же образом, как и из класса. •
Это позволяет изменять нестатические методы экземпляра на статические без необходимости обновления записи вызова функции.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Перегрузка операторов , (запятая), || (логическое ИЛИ), и && (логическое И) сбивает с толку.•
Оператор «запятая» обычно гарантирует, что левая сторона вычисляется до правой.•
Операторы || и && обычно вычисляют правую сторону только при необходимости.•
Перегруженные версии этих операторов — это вызовы функций, которые вычисляются в неопределенном порядке.•
Перегрузка этих операторов может привести к некорректному использованию синтаксиса C++.Please open Telegram to view this post
VIEW IN TELEGRAM
•
C++11 позволяет перегружать методы с использованием квалификатора ссылки, который находится в той же позиции, что и cv-квалификаторы (const и volatile квалификаторы).•
Это влияет на то, какой метод будет вызван для объекта, в зависимости от типа this
, – является ли он lvalue
или же rvalue
.Please open Telegram to view this post
VIEW IN TELEGRAM
C++ включает синтаксическое сокращение для одновременного объявления переменной и разветвления по её значению.
•
Это выглядит как декларация переменной внутри условия оператора if
или while
, и одновременное присваивание ей значения.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Размещающий new - это альтернативный синтаксис для оператора new, который размещает объект в уже выделенной памяти. Он используется для настройки vtable
и вызова конструктора.•
Размещающий new полезен для написания кастомных аллокаторов, оптимизирующих производительность. Он позволяет выделить большой блок памяти и последовательно размещать объекты без пробелов, что уменьшает фрагментацию памяти и снижает накладные расходы.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Переопределение ключевых слов — плохая практика программирования, но это возможно через препроцессор. Это может вводить баги, например, #define true false
или #define else
.#define int float
#define float char
•
Такой код будет работать, хотя это может быть полезно в некоторых ситуациях. Например, если мы используем большую библиотеку и не хотим публичного наследования, мы можем временно отключить защиту доступа перед подключением заголовков библиотеки, а затем снова включить её.#define public private
#include "mylibrary.h"
#undef private
•
Это позволяет управлять доступом к библиотеке без её изменения, но требует осторожности.Please open Telegram to view this post
VIEW IN TELEGRAM
Lambda-функции — это мощный инструмент в C++, позволяющий определять анонимные функции прямо в месте их использования.
•
Они особенно полезны для создания компактного и читаемого кода, например, при работе с алгоритмами из стандартной библиотеки (STL).Please open Telegram to view this post
VIEW IN TELEGRAM
•
Типобезопасные перечисления, которые решают множество проблем с C-перечислениями, включая неявные преобразования, арифметические операции, невозможность указать базовый тип, загрязнение области видимости и т.д.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Использование private и public при наследовании в C++ позволяет контролировать доступ к членам базового класса в производных классах.•
Это может быть полезно для сокрытия частей реализации базового класса от внешнего мира или ограничения доступа к членам в иерархии классов.•
Эта фишка особенно полезна при проектировании классов и их взаимодействия, позволяя более гибко управлять доступом к данным и методам в рамках наследования.Please open Telegram to view this post
VIEW IN TELEGRAM
Итераторы-адаптеры - это классы, которые оборачивают стандартные итераторы и предоставляют дополнительные возможности или изменяют их поведение.
•
Итераторы-адаптеры предоставляют дополнительные возможности для работы с итераторами, такие как итерация в обратном порядке или фильтрация элементов.•
Использование итераторов-адаптеров позволяет упростить код и делает его более читаемым за счет высокоуровневого интерфейса.•
Итераторы-адаптеры добавляют гибкость в работу с контейнерами, позволяя выполнять сложные операции и манипуляции с элементами.Please open Telegram to view this post
VIEW IN TELEGRAM
•
Параметром шаблона могут быть конкретные целые числа.•
Параметром шаблона также могут быть конкретные функции.•
Это позволяет компилятору встраивать вызовы для этих функций в коде инстанцированного шаблона для более эффективного выполнения.•
В примере ниже, функция memoize()
в качестве шаблонного параметра получает функцию и вызывает эту функцию для новых значений аргумента.•
Старое сохранённое значение аргумента берётся из кеша.Please open Telegram to view this post
VIEW IN TELEGRAM
В многопоточных приложениях иногда требуется лениво инициализировать ресурсы, гарантируя, что это произойдет только один раз, даже если несколько потоков пытаются сделать это одновременно.
std::call_once
.Please open Telegram to view this post
VIEW IN TELEGRAM
В C++ утечки памяти могут стать серьезной проблемой, особенно в больших проектах. Один из способов обнаружения утечек памяти — переопределение оператора new, чтобы отслеживать выделение и освобождение памяти.
•
Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map
.•
Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations
.•
В конце программы проверяется, остались ли неосвобожденные участки памяти, что позволяет обнаружить утечки.Please open Telegram to view this post
VIEW IN TELEGRAM
В C++ оператор
decltype
позволяет определить тип переменной на основе типа другого выражения. Это особенно полезно в шаблонном программировании для создания зависимых типов, когда точный тип заранее неизвестен.•
Оператор decltype
определяет тип sum на основе типа элементов, возвращаемых итератором контейнера. Это позволяет избежать жесткого кодирования типов и делает код более гибким.•
Использование decltype
в шаблонных функциях позволяет писать более универсальный код, который корректно работает с различными типами контейнеров.Please open Telegram to view this post
VIEW IN TELEGRAM