C++ собеседования
874 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
Статический полиморфизм разрешается на этапе компиляции и включает перегрузку функций и шаблоны. Динамический полиморфизм разрешается во время выполнения и реализуется через виртуальные функции и наследование.


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
std::is_base_of — это шаблонный метафункция из библиотеки type_traits, которая проверяет, является ли один класс базовым для другого. Она возвращает true, если первый тип является базовым классом второго, и false в противном случае.

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

Основные компоненты STL:
- Контейнеры: vector, list, map, set и другие структуры для хранения данных.
- Алгоритмы: sort, find, copy и другие операции над данными.
- Итераторы: обеспечивают доступ к элементам контейнеров.

Пример:

#include <vector>
#include <algorithm>

int main() {
std::vector<int> vec = {5, 3, 1, 4, 2};
std::sort(vec.begin(), vec.end()); // Сортировка вектора
return 0;
}


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

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

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

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

Пример:

#include <future>
#include <iostream>

int main() {
std::packaged_task<int()> task([](){ return 42; });
std::future<int> result = task.get_future();

std::thread t(std::move(task)); // Запуск задачи в отдельном потоке
t.join();

std::cout << result.get(); // Получение результата: 42
return 0;
}


std::packaged_task полезен для управления асинхронными операциями и синхронизации результатов между потоками.

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

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
🛑Наследование в C++ позволяет создавать новый класс на основе существующего, наследуя его свойства и методы. Класс-наследник (производный класс) может расширять или переопределять функциональность базового класса.


class Base {
public:
void display() {
cout << "Base class" << endl;
}
};

class Derived : public Base {
public:
void display() {
cout << "Derived class" << endl; // Переопределение метода
}
};


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

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

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
🔵Цикл for в C++ состоит из трех частей: инициализации, условия и инкремента/декремента. Он выполняется до тех пор, пока условие истинно.


for (int i = 0; i < 10; i++) {
// Тело цикла
}


1. Инициализация: int i = 0 — выполняется один раз перед началом цикла.
2. Условие: i < 10 — проверяется перед каждой итерацией. Если условие ложно, цикл завершается.
3. Инкремент: i++ — выполняется после каждой итерации.

Цикл for также поддерживает range-based итерацию для работы с коллекциями:


for (int value : array) {
// Тело цикла
}


Этот вариант автоматически перебирает элементы контейнера, упрощая работу с массивами и другими структурами данных.

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

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


while (!ready) {
std::this_thread::yield(); // Уступить время другим потокам
}


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

Использование yield помогает снизить нагрузку на CPU в активных циклах ожидания, но не гарантирует немедленное переключение на другой поток.

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

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


class MyClass {
public:
MyClass(int value) {
// Конструктор с параметром
}
};

int main() {
MyClass obj1(42); // Создание объекта с передачей аргумента в конструктор
MyClass obj2; // Ошибка: если нет конструктора по умолчанию
return 0;
}


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

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

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


class Base {
public:
void display() {
// Метод базового класса
}
};

class Derived : public Base {
// Класс наследует только от Base
};


Множественное наследование позволяет классу наследовать от нескольких базовых классов. Это может быть полезно для комбинирования функциональности, но увеличивает сложность из-за возможных конфликтов имен или "алмаза смерти" (diamond problem).


class Base1 {
public:
void show() {
// Метод первого базового класса
}
};

class Base2 {
public:
void print() {
// Метод второго базового класса
}
};

class Derived : public Base1, public Base2 {
// Класс наследует от Base1 и Base2
};


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

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


#include <array>
#include <iostream>

int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5}; // Создание массива на 5 элементов

arr[0] = 10; // Доступ к элементам по индексу
std::cout << "First element: " << arr.front() << "\n"; // Первый элемент
std::cout << "Last element: " << arr.back() << "\n"; // Последний элемент
std::cout << "Size: " << arr.size() << "\n"; // Размер массива

for (int i : arr) {
std::cout << i << " "; // Итерация по массиву
}
return 0;
}


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

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

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


int x = 10;
int* ptr = &x; // ptr хранит адрес x
*ptr = 20; // изменение значения через указатель


Ссылка — это псевдоним для существующего объекта. Не может быть null, должна быть инициализирована при объявлении и не может быть перенаправлена.


int y = 30;
int& ref = y; // ref — псевдоним y
ref = 40; // изменение значения через ссылку


Указатели поддерживают арифметику, ссылки — нет. Ссылки безопаснее, но менее гибкие.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
std::is_polymorphic — это шаблонный класс из <type_traits>, который проверяет, является ли тип полиморфным. Полиморфный тип содержит хотя бы одну виртуальную функцию или наследуется от полиморфного класса.

Возвращает std::true_type или std::false_type в зависимости от результата проверки. Может использоваться для условной компиляции или статических проверок.


struct A { virtual void foo() {} };
struct B : A {};
struct C {};

static_assert(std::is_polymorphic<A>::value); // true
static_assert(std::is_polymorphic<B>::value); // true
static_assert(!std::is_polymorphic<C>::value); // false


Полезен для шаблонного метапрограммирования, когда требуется обрабатывать полиморфные и не полиморфные типы по-разному.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
std::make_unique — удобная функция для создания std::unique_ptr, обеспечивающая безопасность при исключениях и избегающая явного new.

Принимает аргументы конструктора объекта и возвращает std::unique_ptr.


struct Widget {
Widget(int x, int y) {}
};

// Создание unique_ptr с make_unique
auto ptr = std::make_unique<Widget>(10, 20);


Для массивов используетя перегрузка с []:


auto arr = std::make_unique<int[]>(5); // Создает массив из 5 int


Предпочтительнее new + unique_ptr, так как исключает утечки при выбросе исключений.

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

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