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

Существует два типа #include: с угловыми скобками <...> для стандартных библиотек и с кавычками "..." для пользовательских файлов. Это упрощает управление кодом и способствует его повторному использованию, обеспечивая модульность и структурированность программы.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
Std::list и std::vector — это контейнеры из стандартной библиотеки C++, но они имеют разные характеристики и предназначения.

1️⃣ std::vector — это динамический массив, который обеспечивает быстрый доступ к элементам по индексу и эффективное добавление элементов в конец. Однако вставка или удаление элементов в середине может быть медленной, так как требует сдвига элементов.

2️⃣ std::list — это двусвязный список, который позволяет быстро вставлять и удалять элементы в любом месте, но доступ к элементам по индексу медленный, так как требуется последовательный обход.

ℹ️Выбор между ними зависит от конкретных требований к производительности и операциям.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥41
ℹ️Подписывайся на наши новые каналы!

🖥 JS собеседования
🖥 Backend собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
Namespaces используются для организации кода и предотвращения конфликтов имен. Они позволяют группировать связанные классы, функции и переменные, что особенно полезно в больших проектах или при использовании сторонних библиотек.

namespace MyNamespace {
int myVariable;
void myFunction() {
// код
}
}


🔵Для доступа к элементам namespace используется оператор ::

MyNamespace::myFunction();


🔵Можно использовать директиву using, чтобы упростить доступ

using namespace MyNamespace;
myFunction();

Однако это может привести к конфликтам имен, поэтому рекомендуется использовать using только в ограниченных областях видимости.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101
🔥Приоритет операторов в C++ определяет порядок, в котором выполняются операции в выражении. Операторы с более высоким приоритетом выполняются раньше, чем операторы с более низким приоритетом. Например, в выражении 3 + 4 * 5 сначала выполняется умножение, а затем сложение, так как оператор * имеет более высокий приоритет, чем +.

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1😎1
Множественное наследование - это механизм, позволяющий классу наследовать свойства и методы от нескольких базовых классов одновременно.

При множественном наследовании производный класс получает все члены всех своих базовых классов. Это дает возможность комбинировать функциональность разных классов в одном.

Пример синтаксиса:

class Derived : public Base1, public Base2 {
// тело класса
};


Основные проблемы множественного наследования:
〰️ Ромбовидное наследование (diamond problem)
〰️ Неоднозначность при одинаковых именах членов базовых классов
〰️ Увеличение сложности кода

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

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

✈️ С++ собеседования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
✏️ std::cout и std::cin — это стандартные потоки ввода и вывода. Они определены в библиотеке <iostream>.

1️⃣ std::cout используется для вывода данных на стандартный поток вывода, обычно это консоль. Пример использования: std::cout << "Hello, World!";.

2️⃣ std::cin предназначен для ввода данных с клавиатуры. Он считывает данные из стандартного потока ввода. Пример: int x; std::cin >> x;.

Оба потока являются частью пространства имен std, поэтому перед их использованием необходимо либо указать using namespace std;, либо явно использовать префикс std::.

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

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

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

#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