C++ собеседования
860 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
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
priority_queue — это контейнер, который организует элементы в порядке приоритета, где элемент с наивысшим приоритетом всегда находится наверху. По умолчанию используется максимальный элемент (max-heap), но порядок можно изменить с помощью компаратора.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
▶️Разница между std::async и std::thread заключается в уровне абстракции и управлении выполнением задач.

std::thread создает отдельный поток, который требует явного управления (например, вызов join() или `detach()`). Поток начинает выполнение сразу после создания.


std::thread t([](){ /* код для выполнения */ });
t.join(); // Ожидание завершения потока


std::async абстрагирует создание потока и возвращает std::future, который может быть использован для получения результата асинхронной операции. По умолчанию, задача может быть выполнена в отдельном потоке или отложена, в зависимости от политики запуска.


auto future = std::async([](){ return 42; });
int result = future.get(); // Получение результата


std::async удобен для задач с возвращаемым значением, а std::thread — для полного контроля над потоками.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Наследование от std::exception позволяет создавать пользовательские типы исключений, которые могут быть обработаны в блоке catch как стандартные исключения. Это обеспечивает единый интерфейс для обработки ошибок и возможность переопределения метода what() для возвращения описания исключения.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
✔️ Функция sort в STL (Standard Template Library) сортирует элементы в диапазоне, заданном итераторами. По умолчанию используется оператор <, но можно передать пользовательский компаратор для определения порядка сортировки.


#include <algorithm>
#include <vector>

std::vector<int> vec = {4, 2, 5, 1, 3};
std::sort(vec.begin(), vec.end()); // Сортировка по возрастанию


Для сортировки по убыванию можно использовать std::greater:


std::sort(vec.begin(), vec.end(), std::greater<int>());


Функция sort работает за время O(N log N) и использует гибридный алгоритм (обычно Introsort), сочетающий QuickSort, HeapSort и InsertionSort. Это делает её эффективной для большинства случаев.

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

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

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


class Base {
public:
virtual void show() {
// базовая реализация
}
};

class Derived : public Base {
public:
void show() override {
// переопределенная реализация
}
};

Base* obj = new Derived();
obj->show(); // вызовется метод Derived::show()


- Статический полиморфизм: выбор метода определяется на этапе компиляции.
- Динамический полиморфизм: выбор метода определяется во время выполнения на основе типа объекта.

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

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

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


const int maxValue = 100;
maxValue = 200; // Ошибка: попытка изменить константу


const также может применяться к указателям, функциям и методам. Например, метод класса, объявленный как const, гарантирует, что он не изменяет состояние объекта.


class MyClass {
public:
void myMethod() const {
// Этот метод не может изменять поля класса
}
};


Использование const улучшает безопасность кода и помогает компилятору оптимизировать выполнение программы.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
▶️ std::is_same — это шаблонный метафункция из библиотеки <type_traits>, которая проверяет, являются ли два типа одинаковыми. Возвращает std::true_type, если типы идентичны, и std::false_type в противном случае.


#include <type_traits>

bool result1 = std::is_same<int, int>::value; // true
bool result2 = std::is_same<int, double>::value; // false


std::is_same часто используется в шаблонном программировании для проверки типов на этапе компиляции. Это позволяет создавать специализированные реализации функций или классов в зависимости от типов.

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

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

- NULL
- Это макрос, который обычно определяется как 0 или ((void*)0).
- Может вызывать неоднозначности при перегрузке функций, так как компилятор интерпретирует его как целое число (int).

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

Пример:

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

func(NULL); // Вызовется func(int), что может быть неочевидно
func(nullptr); // Однозначно вызовется func(char*)


Использование nullptr предпочтительно в современном C++ для указания нулевого указателя.

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

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