C++ собеседования
855 subscribers
106 photos
222 links
Подготовка к собеседованиям на позицию C/C++ разработчик

Еще больше на сайте https://frontview-it.ru

Backend собеседования - @frontview_backend
C/C++ работа - @frontview_cpp_vacancies
Все IT вакансии - @frontview_all_vacancies
По рекламе - @frontviewit
Download Telegram
typedef используется для создания псевдонимов типов данных, что упрощает чтение и поддержку кода. Он позволяет определять новые имена для существующих типов, что особенно полезно при работе с длинными или сложными объявлениями типов.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Inline функции позволяют компилятору вставлять код функции непосредственно в место её вызова, что может уменьшить накладные расходы на вызов функции и повысить производительность. Однако компилятор может проигнорировать запрос на inline, если функция слишком сложная или если её использование нецелесообразно.


#include <iostream>

inline int add(int a, int b) {
// Простая inline функция для сложения двух чисел
return a + b;
}

int main() {
int result = add(3, 4);
std::cout << "Result: " << result << std::endl;
}


Inline функции полезны для небольших, часто вызываемых функций.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Мьютекс в C++ — это механизм синхронизации, который используется для предотвращения одновременного доступа нескольких потоков к общим ресурсам. Он необходим для обеспечения целостности данных и предотвращения состояния гонки в многопоточных приложениях.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
❗️Основное отличие между массивами и векторами заключается в управлении памятью и гибкости.

Массив — это статический контейнер с фиксированным размером, который задаётся при создании. Размер массива не может изменяться в процессе выполнения программы.


int arr[5] = {1, 2, 3, 4, 5}; // Статический массив из 5 элементов


Вектор — это динамический массив, который может изменять свой размер в процессе выполнения. Вектор автоматически управляет памятью, увеличивая или уменьшая её при добавлении или удалении элементов.


#include <vector>
std::vector<int> vec; // Инициализация вектора
vec.push_back(1); // Добавление элемента
vec.push_back(2); // Вектор автоматически увеличивает размер


Векторы предлагают больше функционала, таких как автоматическое управление памятью и встроенные методы для работы с элементами, в то время как массивы обеспечивают более низкий уровень доступа к памяти и подходят для случаев, когда размер известен заранее.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Виртуальная функция — это функция в базовом классе, которая может быть переопределена в производных классах для обеспечения полиморфного поведения. Вызов виртуальной функции через указатель или ссылку на базовый класс приводит к выполнению версии функции, соответствующей фактическому типу объекта.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Типы int и float используются для хранения числовых данных, но имеют ключевые различия.

- int
: Целочисленный тип, который хранит целые числа без дробной части. Занимает фиксированный объем памяти (обычно 4 байта) и имеет ограниченный диапазон значений (например, от -2³¹ до 2³¹-1).

- float
: Тип с плавающей точкой, который хранит числа с дробной частью. Использует 4 байта памяти и представляет числа в формате IEEE 754. Позволяет работать с дробными значениями, но имеет ограниченную точность из-за особенностей представления.

int a = 5; // Целое число
float b = 5.5f; // Число с плавающей точкой


Основное различие: int подходит для точных целочисленных операций, а float — для вычислений с дробными числами, но с возможной потерей точности.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Умные указатели — это объекты, которые управляют временем жизни динамически выделенной памяти, автоматически освобождая её, когда она больше не нужна. Они помогают избежать утечек памяти и ошибок, связанных с неправильным использованием обычных указателей.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
std::thread::hardware_concurrency — это статическая функция, которая возвращает количество потоков, которые могут быть выполнены одновременно на текущем оборудовании. Это значение обычно соответствует количеству логических процессоров (ядер) в системе.

Функция полезна для оптимизации многопоточных программ, так как позволяет определить оптимальное количество потоков для выполнения задач. Если функция не может определить количество ядер, она возвращает 0.


#include <iostream>
#include <thread>

int main() {
unsigned int numThreads = std::thread::hardware_concurrency();
std::cout << "Number of concurrent threads supported: " << numThreads << std::endl;
return 0;
}


Использование hardware_concurrency помогает избежать создания избыточного количества потоков, что может привести к снижению производительности из-за накладных расходов на переключение контекста.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Оператор new выделяет память для объекта в динамической памяти и вызывает его конструктор. Оператор delete освобождает выделенную память и вызывает деструктор объекта.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
std::array — это контейнер из стандартной библиотеки, представляющий статический массив фиксированного размера. В отличие от обычных массивов, std::array предоставляет дополнительные методы, такие как size(), begin(), end(), и поддерживает итераторы, что делает его более удобным и безопасным в использовании.

Пример:


#include <array>
#include <iostream>

int main() {
std::array<int, 3> arr = {1, 2, 3}; // Создание массива из 3 элементов
std::cout << "Size: " << arr.size() << std::endl; // Размер массива
}


std::array хранит данные на стеке, что обеспечивает высокую производительность, и гарантирует отсутствие утечек памяти.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
STL (Standard Template Library) включает в себя множество алгоритмов для работы с контейнерами, таких как сортировка (sort), поиск (find, binary_search), модификация (transform, copy), и математические операции (accumulate, min_element). Эти алгоритмы работают через итераторы, обеспечивая универсальность и эффективность.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
😎std::scoped_lock — это класс из стандартной библиотеки, предназначенный для безопасного захвата нескольких мьютексов одновременно. Он предотвращает deadlock, используя алгоритм избежания взаимоблокировок. При создании объекта scoped_lock происходит захват всех переданных мьютексов, а при выходе из области видимости — их автоматическое освобождение.


std::mutex mtx1, mtx2;

{
std::scoped_lock lock(mtx1, mtx2); // Захватывает оба мьютекса
// Критическая секция
} // Мьютексы автоматически освобождаются


Использование scoped_lock особенно полезно в ситуациях, где требуется захватить несколько мьютексов одновременно, обеспечивая безопасность и удобство.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
🖇decltype — это ключевое слово, позволяющее определить тип выражения на этапе компиляции. Оно полезно для автоматического вывода типов, особенно в шаблонах или при работе с сложными выражениями, где тип не очевиден.


int x = 10;
decltype(x) y = 20; // Тип y будет int, так как тип x — int


decltype также учитывает категорию значения (lvalue, rvalue), что делает его полезным для точного определения типов в сложных сценариях. Например, при работе с возвращаемыми значениями функций или выражениями.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Модульное тестирование — это процесс проверки корректности работы отдельных частей программы (модулей) в изоляции от остального кода. Оно нужно для раннего выявления ошибок, упрощения отладки и обеспечения стабильности кода при изменениях.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
✏️ RESTful API — это архитектурный стиль для создания веб-сервисов, основанный на принципах REST (Representational State Transfer). Основные принципы включают:

1. Единообразие интерфейса: Использование стандартных HTTP-методов (GET, POST, PUT, DELETE) для выполнения операций.
2. Отсутствие состояния: Каждый запрос содержит всю информацию, необходимую для его обработки.
3. Кэширование: Ответы могут быть кэшируемыми для повышения производительности.
4. Клиент-серверная архитектура: Четкое разделение между клиентом и сервером.
5. Слоистая система: Возможность использования промежуточных слоев (прокси, шлюзы) без изменения интерфейса.


// Пример HTTP-запроса GET для получения данных
GET /api/resource/123 HTTP/1.1
Host: example.com


RESTful API широко используется благодаря своей простоте, масштабируемости и удобству интеграции.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Модульность — это принцип проектирования, при котором программа разделяется на независимые, функционально завершенные части (модули). Она важна для упрощения разработки, тестирования, поддержки и повторного использования кода.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹Деструктор — это специальный метод класса, который автоматически вызывается при уничтожении объекта. Основное назначение деструктора — освобождение ресурсов, которые были выделены объектом во время его жизни (например, динамическая память, файловые дескрипторы и т.д.).

Деструктор имеет имя, совпадающее с именем класса, но с тильдой (~) в начале. У него нет возвращаемого типа и параметров. Пример:


class MyClass {
public:
~MyClass() {
// Освобождение ресурсов
}
};


Деструктор вызывается в следующих случаях:
1. При выходе объекта из области видимости.
2. При явном вызове delete для объекта, созданного через new.
3. При завершении программы, если объект был создан в глобальной области видимости.

Деструкторы особенно важны для классов, управляющих ресурсами, чтобы избежать утечек памяти и других проблем.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Шаблон класса позволяет создавать обобщенные классы, которые могут работать с различными типами данных. При создании объекта шаблонного класса указывается конкретный тип, и компилятор генерирует специализированную версию класса для этого типа.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
😎std::unique_lock — это класс из стандартной библиотеки, предоставляющий более гибкий способ управления мьютексами по сравнению с std::lock_guard. Он позволяет захватывать и освобождать мьютекс вручную, поддерживает отложенную блокировку, а также может быть перемещён или передан в другие функции.

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void task() {
std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // Отложенная блокировка
lock.lock(); // Захват мьютекса
std::cout << "Critical section\n";
lock.unlock(); // Освобождение мьютекса
}


std::unique_lock полезен в сценариях, где требуется более тонкий контроль над блокировками, например, при использовании условных переменных.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
std::weak_ptr — это умный указатель, который позволяет наблюдать за объектом, управляемым std::shared_ptr, без увеличения счётчика ссылок. Он используется для предотвращения циклических зависимостей и может быть преобразован в std::shared_ptr для временного доступа к объекту.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
🙅‍♂️ nullptr — это ключевое слово, представляющее нулевой указатель. Оно было введено в C++11 для замены макроса NULL и литерала 0, которые использовались ранее.


int* ptr = nullptr;


nullptr имеет тип std::nullptr_t, что позволяет избежать неоднозначностей при перегрузке функций.


void func(int);
void func(int*);

func(nullptr); // Вызовется void func(int*)


Использование nullptr повышает безопасность и читаемость кода, так как явно указывает на нулевой указатель.

Ставь 👍, если было полезно!
Больше ответов на сайте 👈

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM