C/C++ | Вопросы собесов

channel icon
Разбираем вопросы с собеседований на С/С++ разработчика.

Сайт: easyoffer.ru

Условия размещения

Цена за 48 часов в ленте 4100,00
Цена за 1 час закрепления N/A
Взаимопиар Нет
Дополнительные условия рекламы Отсутствуют
+5
4 230
подписчиков
+13
861
охват 1 публикации
0
~4
постов / день
+0,3%
20,4%
ERR % ?

Статистика

Последние публикации

C/C++ | Вопросы собесов
21 декабря 2024 г. 19:10
🤔🤔 Что пришло на смену auto_ptr?

На смену auto_ptr пришли умные указатели unique_ptr и shared_ptr. unique_ptr безопаснее управляет памятью и исключает случайное копирование, что было проблемой в auto_ptr. Эти новые указатели входят в стандарт C++11 и являются более надежными.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
21 декабря 2024 г. 13:31
Откройте подписку на Кинопоиск и Музыку за 1₽Откройте подписку на Кинопоиск и Музыку за 1₽

Ответьте на 1 вопрос и получите в подарок доступ к Кинопоиску, Музыке и Книгам на 60 дней за 1 рубль.

✨ Сервисы будут доступны не только для Вас, но и для трёх ваших близких

ПопробоватьПопробовать

#реклама 18+
kinopoisk.ru

О рекламодателе
Реклама на Яндексе
C/C++ | Вопросы собесов
21 декабря 2024 г. 12:10
🤔 Для чего может использоваться std::optional?Для чего может использоваться std::optional?

Это контейнер, введенный в стандарт C++17, который может содержать значение или быть пустым. Он используется для представления объектов, которые могут быть или не быть инициализированными. Это удобный способ обработки значений, которые могут отсутствовать, без необходимости использования указателей или специальных значений, таких как NULL или -1.

🚩Основные применения

🟠Возвращение значения из функции
std::optional часто используется для возврата значения из функции, когда результат может отсутствовать. Это позволяет явно указывать, что результат может быть неопределенным.
#include 
#include
#include

std::optional find_username(int user_id) {
if (user_id == 1) {
return "Alice";
} else if (user_id == 2) {
return "Bob";
} else {
return std::nullopt; // Возвращение пустого optional
}
}

int main() {
auto username = find_username(1);
if (username) {
std::cout << "Found user: " << *username << std::endl;
} else {
std::cout << "User not found" << std::endl;
}

auto missing_username = find_username(3);
if (missing_username) {
std::cout << "Found user: " << *missing_username << std::endl;
} else {
std::cout << "User not found" << std::endl;
}

return 0;
}


🟠Передача необязательных аргументов
std::optional можно использовать для передачи необязательных аргументов в функции, что позволяет более гибко управлять параметрами функции.
#include 
#include

void print_message(const std::string& message, std::optional line_number = std::nullopt) {
std::cout << message;
if (line_number) {
std::cout << " (line " << *line_number << ")";
}
std::cout << std::endl;
}

int main() {
print_message("Hello, World!");
print_message("Error occurred", 42);
return 0;
}


🟠Отложенная инициализация
std::optional позволяет отложить инициализацию переменной до момента, когда значение станет доступным.
#include 
#include

int main() {
std::optional maybe_value;
// Инициализация позже
maybe_value = 10;

if (maybe_value) {
std::cout << "Value is " << *maybe_value << std::endl;
} else {
std::cout << "Value is not initialized" << std::endl;
}

return 0;
}


🟠Улучшение читаемости и надежности кода
std::optional делает код более явным и понятным, показывая, где значения могут отсутствовать. Это помогает избежать ошибок, связанных с использованием неинициализированных или специальных значений.

🚩Плюсы

Явное указание отсутствия значения
std::optional явно показывает, что значение может быть отсутствующим, что улучшает читаемость и понимание кода.
Безопасность
Использование std::optional устраняет необходимость использования магических значений или указателей, что снижает риск ошибок.
Гибкость
std::optional можно использовать для любого типа данных, что делает его универсальным инструментом.

Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
20 декабря 2024 г. 15:15
Дарим подписку на Яндекс МузыкуДарим подписку на Яндекс Музыку

Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 60 дней бесплатно.
Кинопоиск и Яндекс Книги тоже в подписке.
Попробуйте сейчас❤️

ПопробоватьПопробовать

#реклама 18+
music.yandex.ru

О рекламодателе
Реклама на Яндексе
C/C++ | Вопросы собесов
20 декабря 2024 г. 12:10
🤔 Что такое функции обратного вызова?Что такое функции обратного вызова?

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

🚩Основные характеристики

🟠Передача как параметр
Функции обратного вызова передаются как параметры другим функциям.
🟠Вызов в определенный момент
Они вызываются внутри функции, которая их получила, в определенный момент времени или по определенному условию.
🟠Гибкость и расширяемость
Использование функций обратного вызова позволяет легко изменять поведение программы без необходимости изменения основной функции.

🟠Пример на С
В языке C функции обратного вызова обычно реализуются с использованием указателей на функции.
#include 

// Объявление функции обратного вызова
void callback_function(int value) {
printf("Callback called with value: %d\n", value);
}

// Функция, принимающая указатель на функцию в качестве параметра
void process_value(int value, void (*callback)(int)) {
// Некоторая обработка
value *= 2;

// Вызов функции обратного вызова
callback(value);
}

int main() {
int x = 5;
// Передача функции обратного вызова
process_value(x, callback_function);
return 0;
}


🟠Пример на C++
В C++ можно использовать указатели на функции, объекты-функции (functors) и лямбда-функции в качестве функций обратного вызова.
#include 
#include

// Функция обратного вызова
void callback_function(int value) {
std::cout << "Callback called with value: " << value << std::endl;
}

// Функция, принимающая std::function в качестве параметра
void process_value(int value, std::function callback) {
// Некоторая обработка
value *= 2;

// Вызов функции обратного вызова
callback(value);
}

int main() {
int x = 5;

// Использование указателя на функцию
process_value(x, callback_function);

// Использование лямбда-функции
process_value(x, [](int val) {
std::cout << "Lambda callback called with value: " << val << std::endl;
});

// Использование объекта-функции
struct Functor {
void operator()(int val) {
std::cout << "Functor callback called with value: " << val << std::endl;
}
};

Functor functor;
process_value(x, functor);

return 0;
}


🚩Применение в асинхронном программировании

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

Пример с асинхронным вызовом
#include 
#include

// Функция обратного вызова
void callback_function() {
std::cout << "Async operation completed" << std::endl;
}

// Асинхронная функция
void async_operation(std::function callback) {
std::thread([callback]() {
// Имитация длительной операции
std::this_thread::sleep_for(std::chrono::seconds(2));

// Вызов функции обратного вызова
callback();
}).detach();
}

int main() {
std::cout << "Starting async operation..." << std::endl;
async_operation(callback_function);

// Основной поток продолжает выполнять свою работу
std::cout << "Main thread continues..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));

return 0;
}


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
19 декабря 2024 г. 19:10
🤔🤔 Какая сложность удаления в list и vector по итератору?

В list удаление по итератору — O(1), так как достаточно перенастроить ссылки. В vector удаление занимает O(n), так как все последующие элементы необходимо сдвинуть.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
19 декабря 2024 г. 15:13
Облачная (виртуальная) АТСОблачная (виртуальная) АТС

Простое подключение, запись разговоров, аналитика, IVR, интеграция с CRM, call-tracking.
Бесплатный тестовый период 7 дней.

Перейти на сайтПерейти на сайт

#реклама 16+
1ats.ru

О рекламодателе
C/C++ | Вопросы собесов
19 декабря 2024 г. 12:10
🤔 Что такое перегрузка и переопределение в С++?Что такое перегрузка и переопределение в С++?

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

🚩Перегрузка (Overloading)

Перегрузка функций или методов позволяет создавать несколько функций с одним и тем же именем, но с разными параметрами (типами и/или количеством). Перегруженные функции могут быть как обычными функциями, так и методами класса.
#include 

// Перегруженные функции для сложения двух чисел разных типов
int add(int a, int b) {
return a + b;
}

double add(double a, double b) {
return a + b;
}

int main() {
std::cout << add(3, 4) << std::endl; // Вызов int add(int, int)
std::cout << add(3.5, 4.5) << std::endl; // Вызов double add(double, double)
return 0;
}


Перегрузки методов класса
#include 

class Print {
public:
void display(int i) {
std::cout << "Integer: " << i << std::endl;
}

void display(double f) {
std::cout << "Double: " << f << std::endl;
}

void display(const std::string& s) {
std::cout << "String: " << s << std::endl;
}
};

int main() {
Print printer;
printer.display(5); // Вызов display(int)
printer.display(3.14); // Вызов display(double)
printer.display("Hello"); // Вызов display(std::string)
return 0;
}


🚩Переопределение (Overriding)

Переопределение происходит, когда метод базового класса определяется повторно в производном классе с той же сигнатурой (именем и параметрами). Это позволяет производному классу предоставлять свою собственную реализацию метода, которая заменяет реализацию базового класса при вызове метода через объект производного класса.
#include 

class Base {
public:
virtual void show() {
std::cout << "Base class show function" << std::endl;
}

virtual ~Base() = default; // Виртуальный деструктор для правильного удаления производных объектов
};

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

int main() {
Base* basePtr = new Derived();
basePtr->show(); // Вызов метода show() из класса Derived
delete basePtr;
return 0;
}


🚩Ключевые различия

🟠Перегрузка
Одна и та же функция имеет несколько вариантов с разными параметрами.
Реализуется в одном и том же классе (или в глобальной области).
Не требует использования ключевого слова virtual.

🟠Переопределение
Метод базового класса определяется повторно в производном классе с той же сигнатурой.
Используется в иерархии классов.
Требует использования ключевого слова virtual в базовом классе и может использовать override в производном классе для явного указания переопределения.

Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
18 декабря 2024 г. 19:10
🤔🤔 Может ли быть проблема со вставкой ста элементов через push_back?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
18 декабря 2024 г. 14:42
Лицензионные решения Microsoft доступные в РоссииЛицензионные решения Microsoft доступные в России

Доступные решения к продаже на территории России со сроком подписки 12 месяцев:

- Microsoft Office 365 для бизнеса (Basic, Standard, Premium)
- Office E1, E3, E5, Microsoft F1, F3, F5
- Project Plan 5
- Microsoft Power BI
- Microsoft Dynamics 365

Заполните заявку, чтобы подключить продукт Microsoft

ПопробоватьПопробовать

#реклама 16+
cloud4y.ru

О рекламодателе
C/C++ | Вопросы собесов
18 декабря 2024 г. 12:10
🤔 В чем разница между struct и class?В чем разница между struct и class?

Являются ключевыми словами, используемыми для определения пользовательских типов данных, и имеют схожие возможности. Однако между ними есть несколько ключевых различий, которые касаются в основном доступа по умолчанию и подхода к дизайну.

🚩Основные различия между `struct` и `class`

🟠Доступ по умолчанию
struct: Все члены (переменные и методы) по умолчанию имеют публичный (public) доступ.
class: Все члены (переменные и методы) по умолчанию имеют приватный (private) доступ.
struct MyStruct {
int x; // Публичный по умолчанию
};

class MyClass {
int x; // Приватный по умолчанию
};


🟠Назначение и семантика
struct: Исторически использовались для простых данных (Plain Old Data, POD). В современной практике struct часто используется для агрегирования данных, без сложной логики.
class: Используется для создания более сложных объектов с инкапсуляцией данных и логикой, используя принципы объектно-ориентированного программирования (ООП).

Со struct
struct Point {
int x;
int y;

void move(int dx, int dy) {
x += dx;
y += dy;
}
};

int main() {
Point p = {10, 20};
p.move(5, 5);
std::cout << "Point: (" << p.x << ", " << p.y << ")" << std::endl; // Вывод: Point: (15, 25)
return 0;
}


С class
class Circle {
private:
double radius;

public:
Circle(double r) : radius(r) {}

double getArea() const {
return 3.14159 * radius * radius;
}

void setRadius(double r) {
radius = r;
}
};

int main() {
Circle c(10);
std::cout << "Area: " << c.getArea() << std::endl; // Вывод: Area: 314.159
c.setRadius(5);
std::cout << "New Area: " << c.getArea() << std::endl; // Вывод: New Area: 78.53975
return 0;
}


🚩Подробные различия и особенности

🟠Конструкторы, деструкторы и методы
В struct и class можно определять конструкторы, деструкторы и методы. Разница лишь в доступе по умолчанию.

🟠Наследование
В struct и class поддерживается наследование. Однако доступ по умолчанию для наследования тоже различается:
struct: Наследование по умолчанию является публичным.
class: Наследование по умолчанию является приватным.
struct BaseStruct {};
struct DerivedStruct : BaseStruct {}; // public наследование

class BaseClass {};
class DerivedClass : BaseClass {}; // private наследование


🟠Использование в шаблонах
struct и class могут быть использованы в шаблонных классах и функциях.
template 
struct MyTemplateStruct {
T value;
};

template
class MyTemplateClass {
T value;
};


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
18 декабря 2024 г. 10:00
А вы знали что?...

🕵️В Windows есть папка, которая собирает на вас компромат!

Посмотрите видео выше — насколько легко узнать всю информацию о вас

Простых способов узнать о вас практически всё — сотни, и если вы хотите соблюдать хотя бы минимум сетевой гигиены — подпишитесь на IT ВЕДОМСТВО

Они рассказывает о признаках майнеров, как удалить трояны и порно-баннеры за 5 минут

Помимо всего этого, сейчас владелец канала проводит розыгрыш умной колонки, для всех новоприбывших подписчиков

💻 Подписываемся на IT ВЕДОМСТВОIT ВЕДОМСТВО — выигрываем призы и соблюдаем цифровую гигиену
C/C++ | Вопросы собесов
17 декабря 2024 г. 19:10
🤔🤔 Из чего состоит shared_ptr?

shared_ptr состоит из указателя на объект и счетчика ссылок, управляющего временем жизни объекта. Когда количество ссылок становится нулевым, shared_ptr автоматически удаляет объект. Он также поддерживает совместное использование ресурсов между несколькими владельцами, что делает его удобным для совместного владения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
17 декабря 2024 г. 15:20
Аукцион выделенных серверов от Selectel!Аукцион выделенных серверов от Selectel!

Популярные конфигурации выделенных серверов становятся дешевле в реальном времени.
Успейте арендовать их, пока это не сделал кто-то другой!🏃‍♂️

ЗабронироватьЗабронировать

#реклама
selectel.ru

О рекламодателе
C/C++ | Вопросы собесов
17 декабря 2024 г. 12:10
🤔 В каком порядке элементы списка инициализируются в конструкторе после двоеточия?В каком порядке элементы списка инициализируются в конструкторе после двоеточия?

Порядок инициализации элементов списка инициализации конструктора (initializer list) определяется порядком объявления членов класса, а не порядком, указанным в списке инициализации. Это важно понимать, так как неправильный порядок может привести к неожиданным ошибкам, особенно при инициализации зависимых членов.

#include 

class MyClass {
private:
int a;
int b;
int c;

public:
MyClass(int x, int y, int z) : c(z), b(y), a(x) {
std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;
}
};

int main() {
MyClass obj(1, 2, 3);
return 0;
}


🚩Список инициализации конструктора

В конструкторе MyClass список инициализации указан в порядке c(z), b(y), a(x). Однако это не влияет на порядок инициализации членов класса. Члены класса будут инициализированы в порядке их объявления: a, затем b, затем c.

🚩Порядок инициализации

1⃣a инициализируется первым (значение x).
2⃣b инициализируется вторым (значение y).
3⃣c инициализируется третьим (значение z).

🚩Вывод программы

Программа выведет
a: 1, b: 2, c: 3


🚩Почему это важно

Неправильный порядок в списке инициализации не приведет к ошибке компиляции, но может вызвать логические ошибки, особенно если один член зависит от другого. Рассмотрим пример с зависимыми членами:
class MyClass {
private:
int a;
int& ref;

public:
MyClass(int x) : ref(a), a(x) { // Неправильный порядок: ref инициализируется до a
std::cout << "a: " << a << ", ref: " << ref << std::endl;
}
};


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
16 декабря 2024 г. 19:10
🤔🤔 Какая архитектура процессора чаще используется little-endian или big-endian?

Архитектура процессора little-endian чаще используется в современных компьютерных системах, особенно в процессорах, основанных на архитектуре x86 и x86_64 от Intel и AMD. Big-endian архитектура используется реже и чаще встречается в сетевых протоколах и некоторых типах встроенных систем.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
16 декабря 2024 г. 12:10
🤔 Расскажите про ключевое слово _fastcall?Расскажите про ключевое слово _fastcall?

Это соглашение о вызове функций, используемое в некоторых компиляторах C и C++ (например, Microsoft Visual C++), которое указывает, что параметры функции должны передаваться через регистры, а не через стек. Это может привести к более быстрой работе программы, так как доступ к регистрами обычно быстрее, чем доступ к стеку.

🚩Основные характеристики

🟠Передача аргументов через регистры
_fastcall передает первые два целочисленных аргумента (например, int, char, long) через регистры ECX и EDX на архитектуре x86. Остальные аргументы передаются через стек.

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

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

#include 

// Функция, использующая соглашение о вызове _fastcall
int __fastcall add(int a, int b) {
return a + b;
}

int main() {
int result = add(5, 3);
std::cout << "Result: " << result << std::endl; // Вывод: Result: 8
return 0;
}


🚩Примечания и ограничения

🟠Платформенная зависимость
_fastcall специфичен для архитектуры x86 и поддерживается не всеми компиляторами. На x64 используется другое соглашение о вызове, и _fastcall не применим.

🟠Совместимость с другими соглашениями о вызове
Если вы используете _fastcall вместе с другими соглашениями о вызове (например, __cdecl, __stdcall), нужно быть осторожным, чтобы избежать ошибок при вызове функций с разными соглашениями о вызове.

🟠Использование в современных проектах
В современных проектах использование _fastcall редко необходимо, так как современные компиляторы достаточно умны, чтобы автоматически оптимизировать вызовы функций, используя подходящие соглашения о вызове. В большинстве случаев вручную указывать _fastcall нет необходимости.

#include 

// Проверка платформы
#ifdef _M_IX86 // Если используется компилятор для архитектуры x86
int __fastcall add(int a, int b) {
return a + b;
}
#else
int add(int a, int b) {
return a + b;
}
#endif

int main() {
int result = add(5, 3);
std::cout << "Result: " << result << std::endl; // Вывод: Result: 8
return 0;
}


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
15 декабря 2024 г. 19:10
🤔🤔 Какая сложность операции вставки у list?

Вставка в list имеет сложность O(1), так как требуется лишь обновление ссылок соседних узлов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
15 декабря 2024 г. 14:32
Миграция в облако? Это легко!Миграция в облако? Это легко!

Собственная инфраструктура устарела или не справляется с нагрузками? Используйте облачные ресурсы! Эксперты Yandex Cloud помогут перейти в облако быстро, легко и безопасно.

✅ Мы полностью сопровождаем процесс.
✅ От вас — только инженер с доступом к инфраструктуре.
✅ Архитектура под ваши задачи, миграция и поддержка на каждом шагу — всё включено.

⚡Переходите в Yandex Cloud и забудьте о старом железе. А если успеете подать заявку до 31 декабря, мы покроем расходы на инженеров и тестовую инфраструктуру.

Подать заявкуПодать заявку

#реклама 16+
yandex.cloud

О рекламодателе
Реклама на Яндексе
C/C++ | Вопросы собесов
15 декабря 2024 г. 12:10
🤔 Назовите три краеугольных камня ООП?Назовите три краеугольных камня ООП?

Три краеугольных камня ООП: инкапсуляция, наследование и полиморфизм. Инкапсуляция защищает данные и скрывает детали реализации. Наследование позволяет создавать новые классы на основе существующих, а полиморфизм обеспечивает гибкость через переопределение методов.

🚩Инкапсуляция

Это механизм объединения данных и методов, работающих с этими данными, в единый объект. Это также скрывает внутреннюю реализацию объекта от внешнего мира и предоставляет доступ к данным только через методы.
class Account {
private:
double balance;

public:
Account(double initial_balance) : balance(initial_balance) {}

void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}

void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
}
}

double getBalance() const {
return balance;
}
};


🚩Наследование

Это механизм, позволяющий создавать новый класс на основе существующего. Новый класс наследует атрибуты и методы базового класса, что позволяет повторно использовать код и добавлять новую функциональность.
class Shape {
public:
virtual double area() const = 0; // Чисто виртуальная функция
};

class Circle : public Shape {
private:
double radius;

public:
Circle(double r) : radius(r) {}

double area() const override {
return 3.14159 * radius * radius;
}
};

class Rectangle : public Shape {
private:
double width, height;

public:
Rectangle(double w, double h) : width(w), height(h) {}

double area() const override {
return width * height;
}
};


🚩Полиморфизм

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

void printArea(const Shape& shape) {
std::cout << "Area: " << shape.area() << std::endl;
}

int main() {
Circle circle(5);
Rectangle rectangle(4, 6);

std::vector shapes = {&circle, &rectangle};

for (const auto* shape : shapes) {
printArea(*shape); // Полиморфный вызов
}

return 0;
}


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний