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

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

Backend собеседования - @frontview_backend
C/C++ работа - @frontview_cpp_vacancies
Все IT вакансии - @frontview_all_vacancies
Download Telegram
Статические переменные — это переменные, которые сохраняют своё значение между вызовами функции или в пределах класса. Они инициализируются только один раз и существуют на протяжении всего времени выполнения программы.

👉 В функции статическая переменная сохраняет своё значение между вызовами:

#include <iostream>

void counter() {
static int count = 0;
count++;
std::cout << "Count: " << count << std::endl;
}

int main() {
counter(); // Вывод: Count: 1
counter(); // Вывод: Count: 2
return 0;
}


👉 В классе статическая переменная принадлежит классу, а не объекту, и общая для всех экземпляров.

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

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

Существуют три основные категории паттернов: порождающие, структурные и поведенческие. Порождающие паттерны, такие как Singleton и Factory, управляют созданием объектов. Структурные, например, Adapter и Composite, определяют способы построения классов и объектов. Поведенческие, такие как Observer и Strategy, описывают взаимодействие между объектами.

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

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

void safeFunction() noexcept {
// Код, который не выбрасывает исключений
}

void riskyFunction() {
throw std::runtime_error("Ошибка");
}

int main() {
safeFunction(); // Безопасно
// riskyFunction(); // Это вызовет исключение
}


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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2
std::map и std::set — это контейнеры из стандартной библиотеки C++, которые предоставляют эффективные способы хранения и управления данными.

1⃣ std::map — это ассоциативный контейнер, который хранит пары "ключ-значение". Он автоматически сортирует элементы по ключам и обеспечивает быстрый доступ к значениям по ключу. Пример использования:

#include <map>
#include <iostream>

std::map<int, std::string> myMap;
myMap[1] = "one";
myMap[2] = "two";

for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}


2⃣ std::set — это контейнер, который хранит уникальные элементы в отсортированном порядке. Он предоставляет быстрые операции вставки, удаления и поиска. Пример:

#include <set>
#include <iostream>

std::set<int> mySet = {1, 2, 3};
mySet.insert(4);

for (int n : mySet) {
std::cout << n << std::endl;
}


✔️ Оба контейнера используют деревья поиска для обеспечения логарифмической сложности операций.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2
🔹Указатель this представляет собой неявный параметр, передаваемый в нестатические член-функции класса. Он указывает на текущий экземпляр объекта, для которого вызывается метод. Это позволяет функции обращаться к членам объекта и различать их от локальных переменных или параметров с одинаковыми именами.

🔹 Использование this особенно полезно при необходимости вернуть объект из метода, реализовать метод цепочки вызовов или различать члены класса от параметров функции. Например:

class MyClass {
public:
int value;

void setValue(int value) {
this->value = value;
}
};


🔹В этом примере this->value обозначает член класса value, тогда как параметр функции также называется value. Без использования this компилятор не сможет различить их.

🔹Кроме того, this позволяет реализовать возврат текущего объекта из метода:

MyClass& increment() {
this->value++;
return *this;
}


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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍131🤔1
🔸Inline-функции — это функции, которые компилятор пытается вставить непосредственно в место вызова, чтобы избежать накладных расходов на вызов функции. Это может улучшить производительность, особенно для небольших функций, которые часто вызываются. Для объявления функции inline используется ключевое слово inline.

inline int add(int a, int b) {
return a + b;
}


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

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

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

🖇Ключи в std::unordered_map должны быть уникальными, а для их сравнения и хеширования используются функции std::hash и operator==. Это делает std::unordered_map подходящим для случаев, когда порядок не важен, но требуется высокая скорость доступа к элементам.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122🔥1🤩1💯1👨‍💻1
Аллокаторы — это объекты, которые управляют выделением и освобождением памяти для контейнеров. Они определяют, как и где будет выделяться память, предоставляя интерфейс для работы с памятью.

Стандартная библиотека C++ использует аллокаторы для контейнеров, таких как std::vector и std::list. Аллокаторы обеспечивают гибкость и позволяют оптимизировать использование памяти.

template <typename T>
class CustomAllocator {
public:
using value_type = T;

CustomAllocator() = default;

T* allocate(std::size_t n) {
return static_cast<T*>(::operator new(n * sizeof(T)));
}

void deallocate(T* p, std::size_t) {
::operator delete(p);
}
};


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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2
C++ собеседования pinned «ℹ️Подписывайся на наши новые каналы! 🖥 JS собеседования 🖥 Backend собеседования»
➡️ std::find — это алгоритм из библиотеки <algorithm> в C++, который используется для поиска элемента в диапазоне. Он принимает три аргумента: итераторы начала и конца диапазона, а также значение, которое нужно найти.

#include <vector>
#include <algorithm>
#include <iostream>

std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::find(vec.begin(), vec.end(), 3);

if (it != vec.end()) {
std::cout << "Element found at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "Element not found" << std::endl;
}


➡️ Если элемент найден, std::find возвращает итератор на него, иначе — итератор конца.

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

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122
😎 std::variant — это тип, который может содержать один из нескольких типов. Это альтернатива union, но с поддержкой типов, которые имеют нестандартные конструкторы и деструкторы.

#include <variant>
#include <iostream>

int main() {
std::variant<int, double, std::string> data;

data = 10;
std::cout << std::get<int>(data) << std::endl;

data = 3.14;
std::cout << std::get<double>(data) << std::endl;

data = "Hello";
std::cout << std::get<std::string>(data) << std::endl;

return 0;
}


😎 std::variant позволяет безопасно переключаться между типами, используя std::get для доступа к текущему значению.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍112
🟢 Константный указатель (T* const) — это указатель, адрес которого нельзя изменить после инициализации. Значение, на которое он указывает, может изменяться.

int value = 10;
int* const ptr = &value;
*ptr = 20; // OK
ptr = &anotherValue; // Ошибка


🟢 Указатель на константу (const T*) позволяет изменять адрес, но не значение, на которое он указывает.

const int value = 10;
const int* ptr = &value;
ptr = &anotherValue; // OK
*ptr = 20; // Ошибка


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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥21
Поток — это объект, который позволяет выполнять параллельные вычисления. Создать поток можно с помощью класса std::thread, передав ему функцию или лямбда-выражение, которое будет выполняться в этом потоке.

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
🪅 nullptr — это ключевое слово, введенное в стандарте C++11, которое представляет собой указатель на нулевой адрес. Оно заменяет использование NULL, который в C++ является просто макросом, определенным как 0. Использование nullptr улучшает безопасность и ясность кода, так как он имеет тип std::nullptr_t, что позволяет избежать неоднозначностей при перегрузке функций.


void foo(int* ptr) {
// Функция принимает указатель на int
}

void foo(double val) {
// Функция принимает double
}

foo(nullptr); // Вызовет foo(int*), так как nullptr имеет тип указателя


🪅 nullptr помогает избежать ошибок, связанных с неявным преобразованием типов, и делает код более читаемым.

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

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

〰️ Структуры могут содержать переменные (поля) и функции (методы). В отличие от классов, по умолчанию все члены структуры имеют публичный доступ.


#include <iostream>

// Определение структуры
struct Point {
int x;
int y;

// Метод для вывода координат
void print() {
std::cout << "Point(" << x << ", " << y << ")" << std::endl;
}
};

int main() {
// Создание экземпляра структуры
Point p;
p.x = 10;
p.y = 20;

// Вызов метода структуры
p.print(); // Вывод: Point(10, 20)
}


〰️ Структуры полезны для моделирования объектов с несколькими свойствами, таких как точки, координаты и т.д.

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

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥31
🔹 Лямбда-выражение — это анонимная функция, которая может быть определена в месте, где она используется. Оно позволяет создавать функции без необходимости их именования, что упрощает код и делает его более гибким.

🔹 Синтаксис лямбда-выражения включает в себя захват переменных, параметры, тело функции и возвращаемый тип.


auto sum = [](int a, int b) -> int {
return a + b; // Возвращает сумму a и b
};


🔹 Лямбда-выражения часто используются в алгоритмах стандартной библиотеки, таких как std::for_each или std::sort.

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

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


#include <iostream>
using namespace std;

// Базовый класс
class Animal {
public:
void eat() {
cout << "Eating..." << endl;
}
};

// Производный класс
class Dog : public Animal {
public:
void bark() {
cout << "Barking..." << endl;
}
};

int main() {
Dog dog;
dog.eat(); // Наследованный метод
dog.bark(); // Собственный метод
return 0;
}


Производный класс Dog наследует метод eat() от базового класса Animal.

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

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

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