Ключевое слово extern используется для объявления глобальных переменных и функций, реализация которых находится в другом модуле. Это позволяет разделить интерфейс и реализацию.
Несмотря на разделение кода по файлам, при компиляции программы компоновщик свяжет объявление и реализацию вместе и позволит вызвать print() в main().
std::sort - это функция стандартной библиотеки для сортировки элементов в контейнерах, таких как вектор или список. Чтобы использовать std::sort, нужно подключить заголовочный файл <algorithm>.
Метод принимает в качестве аргументов итераторы на начало и конец сортируемой последовательности и сортирует элементы в возрастающем порядке по умолчанию.
Для определения порядка сортировки можно указать свой компаратор.
#вопросы_с_собеседований Какие накладные расходы связаны с вызовом виртуальной функции?
При вызове виртуальной функции происходят следующие накладные расходы:
1. Поиск в таблице виртуальных функций (vtable): для вызова виртуальной функции компилятор должен сначала получить указатель на нужную функцию из vtable класса. Это занимает некоторое время.
2. Невозможность инлайнинга: тело виртуальной функции неизвестно на этапе компиляции, поэтому оптимизация инлайнинга для таких функций невозможна.
4. Затраты памяти на vtable: для каждого класса с виртуальными функциями нужно хранить таблицу vtable, что увеличивает расход памяти.
Libusb - это кросплатформенная библиотека для работы с USB-устройствами из приложений. Она позволяет обращаться к USB-устройствам, считывать и записывать данные, управлять конфигурацией устройств.
Libusb часто используется для создания приложений, которым нужно низкоуровневое USB-взаимодействие - драйверов устройств, утилит настройки оборудования, средств тестирования и отладки.
Этот код инициализирует libusb, открывает устройство по заданному VID/PID, читает данные bulk-передачей, обрабатывает их, и закрывает соединение с устройством.
std::all_of - это алгоритм из стандартной библиотеки, который позволяет проверить, удовлетворяют ли все элементы диапазона какому-либо условию.
В примере мы создаем вектор целых чисел v и используем all_of, чтобы проверить, что все элементы больше нуля. Для этого передаем в all_of итераторы на начало и конец вектора, а также лямбда-функцию, которая проверяет, что элемент больше нуля.
#вопросы_с_собеседований В каком порядке инициализируются и уничтожаются члены класса?
Сначала вызываются конструкторы базовых классов в порядке наследования. Затем инициализируются члены класса в порядке их объявления в классе. После этого вызывается конструктор текущего класса.
Аналогичным образом происходит уничтожение объекта: Сначала вызывается деструктор текущего класса. Затем уничтожаются члены класса в порядке, обратном их инициализации. Далее вызываются деструкторы базовых классов в обратном порядке наследования.
#вопросы_с_собеседований Для чего нужен был тип std::auto_ptr<T>?
Тип std::auto_ptr<T>использовался для автоматического управления памятью и представляет собой умный указатель на объект типа T.
auto_ptr упрощает управление памятью и исключает утечки памяти из-за забытого вызова delete. Однако в современном C++ auto_ptr считается устаревшим и заменен на std::unique_ptr.
Функции std::begin() и std::end() из заголовочного файла <iterator>используются для получения итераторов на начало и конец контейнера соответственно. Это часто нужно при работе с алгоритмами STL.
В примере std::begin() вернёт итератор на первый элемент контейнера, а std::end() - на позицию за последним элементом.
Эти функции работают со всеми стандартными контейнерами (vector, list, array и т.д.) и позволяют универсально перебирать их элементы.
std::pair - это шаблон класса из стандартной библиотеки, который инкапсулирует пару значений разных типов. Он часто используется для возврата нескольких значений из функции.
В этом примере getStats возвращает пару значений - сумму и среднее элементов массива. С помощью std::pair эти значения упаковываются в один возвращаемый объект. В main используется structured binding для распаковки пары в переменные sum и avg.
#вопросы_с_собеседований Каковы спецификаторы доступа в C++?
Спецификаторы доступа позволяют инкапсулировать данные класса и ограничивать интерфейс взаимодействия с объектами. Это важный инструмент ООП для сокрытия внутренней реализации и предоставления только необходимого уровня доступа извне.
В C++ определены следующие спецификаторы доступа:
public - объявленные таким образом данные и методы класса доступны из любого места программы.
protected - защищенные данные и методы доступны только из самого класса и его подклассов.
private - закрытые элементы доступны только из тела самого класса, где они определены.
Кроме того, есть спецификатор default - когда явный спецификатор доступа не указан. Такие элементы доступны только из текущего класса и друзей.
#вопросы_с_собеседований Как и для чего используется метапрограммирование шаблонов?
Метапрограммирование шаблонов используется для генерации кода программы на этапе компиляции.
Это позволяет создавать высокооптимизированные гибкие библиотеки, которые адаптируются под конкретные типы во время компиляции за счет метапрограммирования шаблонов.