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
static_cast — это оператор приведения типов, который используется для выполнения явного преобразования между совместимыми типами данных во время компиляции. Он обеспечивает более безопасное и контролируемое преобразование по сравнению с традиционными C-стилевыми приведениям, предотвращая некоторые виды ошибок.

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

delete освобождает память, выделенную для одного объекта:

int* ptr = new int(5);
delete ptr; // Освобождает память для одного int


delete[] освобождает память, выделенную для массива объектов:

int* arr = new int[5];
delete[] arr; // Освобождает память для массива int


🙅‍♂️ Использование неправильного оператора может привести к неопределенному поведению. delete для массива не вызовет деструкторы всех элементов, а delete[] для одиночного объекта может вызвать ошибки.

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

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

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


#include <iostream>

union Data {
int intValue;
float floatValue;
char charValue;
};

int main() {
Data data;
data.intValue = 10; // Устанавливаем значение int
std::cout << "Int: " << data.intValue << std::endl;

data.floatValue = 3.14f; // Перезаписываем значение float
std::cout << "Float: " << data.floatValue << std::endl;

return 0;
}


Union полезен для экономии памяти, но требует осторожности, так как изменение одного члена может затронуть другие.

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

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

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


#include <type_traits>

template<typename T>
void check() {
// Проверка, является ли тип целочисленным
if (std::is_integral<T>::value) {
// Логика для целочисленных типов
}
}


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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN 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