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

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

رفتن به کانال در Telegram
4 259
مشترکین
-124 ساعت
-27 روز
+1030 روز
آرشیو پست ها
🤔 Когда начинают жить и умирают глобальные и локальные переменные в С++? Глобальные переменные живут на протяжении всей программы, начиная с инициализации до завершения. Локальные переменные живут с момента входа в блок кода до выхода из него. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний

Получи грант до 3,48 млн на обучение дизайну Поступай на дизайн в Центральный университет с грантом. Для учеников 10–11-х кла
Получи грант до 3,48 млн на обучение дизайну Поступай на дизайн в Центральный университет с грантом. Для учеников 10–11-х классов и СПО. Освой графический, UI/UX и продуктовый дизайн. Создавай визуальные концепты будущего. На программе студенты получают фундаментальную базу, развивают прикладные навыки, приобретают опыт работы над реальными проектами, собирают портфолио и строят связи внутри дизайн-сообщества Подать заявку #реклама 16+ cu.ru О рекламодателе

🤔 Как работает new? Оператор new в C++ выделяет память из кучи (heap) для хранения объекта и возвращает указатель на эту область памяти. Помимо выделения памяти, new также вызывает конструктор объекта, если он определен. В случае, если не хватает памяти для выделения, new выбрасывает исключение std::bad_alloc. Для освобождения памяти, выделенной через new, необходимо использовать оператор delete. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний

Запустите рекламу в телеграм-каналах через Яндекс Директ Перфоманс-реклама в мессенджере продолжает работать: • Таргетинг по
Запустите рекламу в телеграм-каналах через Яндекс Директ Перфоманс-реклама в мессенджере продолжает работать: • Таргетинг по тематикам и регионам • Умный подбор каналов • Гибкие модели оплаты (CPC и CPV) Яндекс Директ знает, как привлечь целевую аудиторию 💰👌 Попробовать #реклама yandex.ru О рекламодателе

🤔 Как убедиться что нет багов в коде? Чтобы убедиться, что в коде нет багов, используют различные методы и инструменты проверки. Рассмотрим основные подходы: 🟠Внимательная проверка кода (Code Review) Перед тем как запускать код, полезно просмотреть его вручную или с коллегами. Это помогает: Найти логические ошибки Улучшить читаемость кода Проверить соответствие код-стайлу
// Опытный разработчик может заметить, что деление на 0 возможно
int divide(int a, int b) {
    return a / b; // Потенциальная ошибка, если b == 0
}
Лучше добавить проверку
int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Деление на ноль!");
    }
    return a / b;
}
🟠Юнит-тестирование (Unit Testing) Тесты проверяют каждую функцию отдельно, чтобы убедиться, что она работает правильно. В C++ используют Google Test (gtest), Catch2 или Boost.Test.
#include <gtest/gtest.h>
#include "math_utils.h"

TEST(DivideFunctionTest, HandlesZeroDenominator) {
    EXPECT_THROW(divide(10, 0), std::runtime_error);
}

TEST(DivideFunctionTest, NormalCase) {
    EXPECT_EQ(divide(10, 2), 5);
}
🟠Отладка (Debugging) Если код работает не так, как ожидалось, используют отладчики (GDB, LLDB, Visual Studio Debugger). Они позволяют пошагово исполнять код и смотреть, где происходит ошибка.
g++ -g main.cpp -o program  # Компилируем с отладочной информацией
gdb ./program  # Запускаем отладчик
🟠Статический анализ кода Используются специальные инструменты, которые автоматически ищут ошибки в коде: Clang-Tidy Cppcheck SonarQube
cppcheck --enable=all my_code.cpp
🟠Динамический анализ (Sanitizers, Valgrind) Эти инструменты помогают находить утечки памяти, переполнения буфера и другие ошибки.
g++ -fsanitize=address -g main.cpp -o program
./program  # Если есть проблемы, они будут найдены
🟠Интеграционное и системное тестирование Когда код протестирован отдельно, его проверяют в реальной среде. Это включает тестирование работы программы с базами данных, сетевыми запросами и другими модулями. Ставь 👍 и забирай 📚 Базу знаний

🤔 Может ли быть проблема со вставкой ста элементов через push_back? Проблема может возникнуть, если память vector переполнена, что требует перераспределения и копирования всех существующих элементов в новый массив, увеличивая временные затраты. Для большого количества вставок рекомендуется заранее вызвать reserve, чтобы выделить необходимую память и избежать перераспределений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний

Яндекс Музыка до 360 дней бесплатно Яндекс Музыка для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попр
Яндекс Музыка до 360 дней бесплатно Яндекс Музыка для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте бесплатно❤️ Слушать #реклама 18+ music.yandex.ru О рекламодателе

🤔 Какая сложность операции вставки у list? Вставка в list имеет сложность O(1), так как требуется лишь обновление ссылок соседних узлов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний

🤔 Когда при вызове exception не зовутся деструкторы? В C++ деструкторы объектов вызываются автоматически при выходе из области видимости, даже если выход происходит из-за исключения. Однако есть ситуации, когда деструкторы могут не вызваться, что может привести к утечке ресурсов. 🟠Динамически выделенные объекты (`new`) Если объект был создан с помощью new, но перед его удалением произошло исключение, деструктор не вызовется автоматически.
#include <iostream>

class A {
public:
    A() { std::cout << "Конструктор A\n"; }
    ~A() { std::cout << "Деструктор A\n"; }
};

void func() {
    A* obj = new A();  // Создаем объект динамически
    throw std::runtime_error("Ошибка!"); // Исключение, объект утечет
    delete obj; // Никогда не выполнится
}

int main() {
    try {
        func();
    } catch (...) {
        std::cout << "Исключение поймано\n";
    }
}
Как исправить? Использовать std::unique_ptr, который автоматически удаляет объект
#include <memory>

void func() {
    std::unique_ptr<A> obj = std::make_unique<A>();
    throw std::runtime_error("Ошибка!"); // Деструктор вызовется автоматически
}
🟠Локальные объекты, созданные `new` внутри `try`, но `catch` не обработал исключение Если объект выделяется внутри try, но исключение не ловится в catch, программа завершится (std::terminate), и деструкторы не вызовутся.
void func() {
    A* obj = new A();
    throw std::runtime_error("Ошибка!"); // std::terminate()
    delete obj;
}

int main() {
    func(); // Исключение не ловится => программа аварийно завершится
}
Как исправить? Нужно обрабатывать исключение на верхнем уровне
int main() {
    try {
        func();
    } catch (...) {
        std::cout << "Ошибка обработана\n";
    }
}
🟠Исключение в конструкторе Если исключение возникает в конструкторе, деструктор этого объекта не вызывается, но деструкторы уже созданных объектов будут вызваны.
class B {
public:
    B() { std::cout << "Конструктор B\n"; }
    ~B() { std::cout << "Деструктор B\n"; }
};

class A {
public:
    A() {
        std::cout << "Конструктор A\n";
        throw std::runtime_error("Ошибка в конструкторе A");
    }
    ~A() { std::cout << "Деструктор A\n"; } // Никогда не вызовется!
};

int main() {
    try {
        B b;
        A a;  // Исключение в конструкторе A
    } catch (...) {
        std::cout << "Исключение обработано\n";
    }
}
Вывод
Конструктор B
Конструктор A
Исключение обработано
Деструктор B
Как исправить? - Использовать концепцию "умные указатели" (std::unique_ptr), чтобы ресурсы очищались автоматически. - Переносить ресурсоемкие операции в отдельный метод (init()), который можно вызывать после конструктора. 🟠Исключение в деструкторе Если деструктор объекта бросает исключение, это опасно, особенно если исключение возникло в момент обработки другого исключения.
class A {
public:
    ~A() {
        std::cout << "Деструктор A\n";
        throw std::runtime_error("Ошибка в деструкторе!"); // Ошибка
    }
};

int main() {
    try {
        A a;
        throw std::runtime_error("Основное исключение");
    } catch (...) {
        std::cout << "Исключение обработано\n";
    }
}
Как исправить? Деструкторы не должны выбрасывать исключения. Если исключение возможно, его следует перехватывать внутри деструктора
class A {
public:
    ~A() {
        try {
            throw std::runtime_error("Ошибка в деструкторе!");
        } catch (...) {
            std::cout << "Ошибка подавлена в деструкторе\n";
        }
    }
};
Ставь 👍 и забирай 📚 Базу знаний

SpaceX: инвестиции в космос и глобальный интернет ⚡ SpaceX — самый дорогой «единорог» мира с потенциальной оценкой на IPO в $
SpaceX: инвестиции в космос и глобальный интернет ⚡ SpaceX — самый дорогой «единорог» мира с потенциальной оценкой на IPO в $1,75 трлн. Объединив космос и ИИ, компания Илона Маска готовится к рекордному размещению акций к лету 2026 года. ✅ Параметры IPO: • Оценка: более $1,75 трлн • Объем: $75 млрд • Дата: июнь 2026 • Вход: от $1 000 Почему SpaceX? • Монополист рынка многоразовых ракет и спутников • Синергия с ИИ-технологиями xAI • Взрывной рост выручки сети Starlink 💻 Как участвовать? Заявка: Оставьте контакты на сайте, чтобы не пропустить старт Счет: Откройте счет в «Финаме» онлайн за 3 минуты Статус: Подтвердите квалификацию (нужна для иностранных IPO) Сделка: Подайте заявку в личном кабинете Не упустите шанс стать частью истории — подайте заявку на участие в IPO заранее! Подать заявку Финансовые услуги оказывает: АО «Инвестиционная компания «ФИНАМ». #реклама broker.finam.ru О рекламодателе

🤔 Что будет если в функции помеченной как noexcept бросить исключение? Если функция, помеченная как `noexcept`, выбросит исключение, программа вызовет `std::terminate()`, что приведёт к немедленному завершению выполнения. Это связано с тем, что `noexcept` гарантирует, что функция не выбросит исключений, и нарушение этого обещания считается критической ошибкой. Использование `noexcept` позволяет оптимизировать код, так как компилятор может делать определённые оптимизации, полагаясь на то, что исключения не будут выбрасываться. Следует избегать выбрасывания исключений в таких функциях. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний

Не грузится? Понимаем. Бесплатный мессенджер для вашей компании - Битрикс24. Личные и групповые чаты, видеозвонки, каналы и н
Не грузится? Понимаем. Бесплатный мессенджер для вашей компании - Битрикс24. Личные и групповые чаты, видеозвонки, каналы и нейросеть. Всё привычно и удобно. Начните работать на бесплатном тарифе уже сейчас. Узнать больше #реклама 16+ bitrix24.ru О рекламодателе

🤔 Расскажи про константные методы? Это методы класса, которые гарантируют, что они не будут изменять состояние объекта, для которого вызываются. Эти методы можно вызывать на константных объектах и через константные ссылки или указатели. Ключевое слово const после объявления метода указывает, что метод является константным. 🚩Объявление и определение константного метода Чтобы объявить метод как константный, нужно добавить ключевое слово const после списка параметров метода:
class MyClass {
public:
    int getValue() const; // Константный метод
    void setValue(int newValue); // Неконстантный метод

private:
    int value;
};

// Определение константного метода
int MyClass::getValue() const {
    return value; // Допустимо: метод не изменяет состояние объекта
}

// Определение неконстантного метода
void MyClass::setValue(int newValue) {
    value = newValue; // Допустимо: метод изменяет состояние объекта
}
🚩Пример использования константных методов
#include <iostream>

class MyClass {
public:
    MyClass(int v) : value(v) {}

    int getValue() const { // Константный метод
        return value;
    }

    void setValue(int newValue) { // Неконстантный метод
        value = newValue;
    }

private:
    int value;
};

int main() {
    MyClass obj(10);

    std::cout << "Value: " << obj.getValue() << std::endl; // Вывод: 10

    obj.setValue(20);
    std::cout << "New value: " << obj.getValue() << std::endl; // Вывод: 20

    // Константный объект
    const MyClass constObj(30);
    std::cout << "Const object value: " << constObj.getValue() << std::endl; // Вывод: 30

    // constObj.setValue(40); // Ошибка: setValue не может быть вызван для константного объекта

    return 0;
}
🚩Почему и когда использовать константные методы 🟠Гарантия неизменности Константные методы гарантируют, что состояние объекта не будет изменено. Это полезно для методов, которые предназначены только для чтения данных объекта, например, методы доступа (геттеры). 🟠Безопасность и семантика Константные методы помогают лучше понимать код и повышают его безопасность, так как ясно видно, какие методы могут изменять состояние объекта, а какие нет. 🟠Работа с константными объектами Константные методы можно вызывать на константных объектах и через константные ссылки или указатели. Это позволяет использовать объекты в контексте, где важно гарантировать их неизменность. 🚩Вызов константных методов на константных объектах
const MyClass constObj(30);
constObj.getValue(); // Допустимо: getValue — константный метод
// constObj.setValue(40); // Ошибка: setValue — неконстантный метод
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какая сложность поиска в set и unordered_set? В set поиск имеет сложность O(log n), так как он реализован как сбалансированное бинарное дерево. В unordered_set сложность поиска в среднем O(1), но в худшем случае (при большом количестве коллизий) может достигать O(n). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний

🤔 Сложность поиска в бинарных деревьях логарифмическая, всегда ли так? Нет, сложность поиска в бинарных деревьях не всегда логарифмическая. Она зависит от структуры дерева. Хотя логарифмическая сложность \(O(\log N)\) считается идеальной, это справедливо только для сбалансированных бинарных деревьев. Давайте разберём, когда эта сложность сохраняется, а когда может увеличиваться. 🚩Идеальный случай: сбалансированное бинарное дерево Если бинарное дерево поиска (Binary Search Tree, BST) сбалансировано, глубина дерева пропорциональна \( \log_2 N \), где \(N\) – количество узлов. В этом случае поиск, вставка и удаление элемента выполняются за \(O(\log N)\). 🚩Худший случай: несбалансированное дерево Если дерево несбалансировано, то оно может выродиться в связный список, где каждый узел имеет только одного потомка (левого или правого). 🚩Как избежать вырождения дерева? Чтобы поддерживать сложность операций \(O(\log N)\), используют сбалансированные бинарные деревья, такие как: 🟠AVL-деревья Поддерживают балансировку после каждой операции вставки/удаления. 🟠Красно-чёрные деревья Гарантируют, что глубина дерева остаётся \(O(\log N)\). 🟠B-деревья и B+ деревья Используются для работы с большими объёмами данных, например, в базах данных. Ставь 👍 и забирай 📚 Базу знаний

Получи грант до 1,35 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с пр
Получи грант до 1,35 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с практикой? Поступай в магистратуру Центрального университета! — 4 офлайн программы по востребованным направлениям ИТ — 2 онлайн-программы: машинное обучение и продуктовый менеджмент — 550 грантов до 75% — Вечерние занятия и учеба по выходным — удобно совмещать с работой — Обучение по модели STEM-образования: на стыке науки, технологий и бизнеса — Возможность стажировок и трудоустройства в ведущих компаниях — Государственный диплом за 2 года Магистратура в Центральном университете — это современный подход к образованию, сильный преподавательский состав и актуальные кейсы от индустрии. Оставляй заявку на грант уже сейчас! Зарегистрироваться #реклама 16+ cu.ru О рекламодателе

Получи грант до 1,35 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с пр
Получи грант до 1,35 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с практикой? Поступай в магистратуру Центрального университета! — 4 офлайн программы по востребованным направлениям ИТ — 2 онлайн-программы: машинное обучение и продуктовый менеджмент — 550 грантов до 75% — Вечерние занятия и учеба по выходным — удобно совмещать с работой — Обучение по модели STEM-образования: на стыке науки, технологий и бизнеса — Возможность стажировок и трудоустройства в ведущих компаниях — Государственный диплом за 2 года Магистратура в Центральном университете — это современный подход к образованию, сильный преподавательский состав и актуальные кейсы от индустрии. Оставляй заявку на грант уже сейчас! Зарегистрироваться #реклама 16+ cu.ru О рекламодателе

C++ разработчики в 2ГИС Сейчас открыто две вакансии в разные команды: — Middle C++ Developer в команду Transport Core Делаем
C++ разработчики в 2ГИС Сейчас открыто две вакансии в разные команды: — Middle C++ Developer в команду Transport Core Делаем транспортный движок 2ГИС: маршруты, графы, расчёты и highload-обработку данных. Team Lead C++ в команду 3D Карты Ищем сильного C++ разработчика на роль играющего тренера: часть времени — разработка, остальное — управление небольшой командой, техрешения и развитие процессов. Важно: опыт именно в графике не обязателен. Если ты сильный плюсовик и хочешь попробовать себя в 3D-направлении — откликайся! Что общего: — современный C++ — сложные инженерные задачи — большие объёмы данных — сильные команды без лишней бюрократии Можно удалённо Вакансии: Middle C++ Developer — Transport Core Team Lead C++ — 3D Карты Другие инженерные инсайты от 2ГИС → в Telegram-канале RnD

Аренда VPS/VDS-сервера. Виртуальные выделенные серверы в дата-центрах уровня Tier III — 7 готовых конфигураций от 200 ₽/мес.
Аренда VPS/VDS-сервера. Виртуальные выделенные серверы в дата-центрах уровня Tier III — 7 готовых конфигураций от 200 ₽/мес. Преимущества аренды: - Выделенные ресурсы без переплаты; - KVM-виртуализация; - Быстрые NVMe SSD; - Соответствие 152-ФЗ, PCI DSS; - Бесплатная защита от DDoS; - Управление через панель, API и Terraform; - Техподдержка 24/7. Запустите сервер за несколько минут! Попробовать #реклама 16+ selectel.ru О рекламодателе

Главный навык на ближайшие годы — ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запуска
Главный навык на ближайшие годы — ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запускать продукты быстрее, чем это делали классические команды разработки. И это уже не "будущее когда-нибудь", а реальность, которая меняет рынок уже сегодня И те, кто научится вайбкодить сейчас, будут увереннее конкурировать на рынке и зарабатывать больше тех, кто по-прежнему делает всё вручную. Стартовать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы. Подписывайтесь, нас уже 30 тысяч: @vibecoding_tg