Библиотека собеса по C++ | вопросы с собеседований
4.68K subscribers
387 photos
2 videos
168 links
Вопросы с собеседований по C++ и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/9ccf302b

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👩‍🚀 Откуда космический корабль в C++?

<=> — это оператор spaceship operator в C++. Он был введен в стандарте C++20 и предназначен для использования в контексте трехзначной операции сравнения

🔎 Этот оператор выполняет сравнение двух выражений и возвращает одно из трех значений:
• Отрицательное значение, если левый операнд меньше правого
• Ноль, если левый операнд равен правому
• Положительное значение, если левый операнд больше правого
🔮 Челлендж от анализатора PVS-Studio: насколько вы внимательны?

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

Челлендж состоит из 10 фрагментов кода, в которых есть ошибки. Все они взяты из известных Open Source проектов. Если вы успеваете найти ошибку за 60 секунд — вам начисляется один балл. Фрагменты кода короткие, поэтому 60 секунд — это честное ограничение

👉 Ссылка
🫣 Что за оператор --> ?

На самом деле это два отдельных оператора, -- и >, т.е. постфиксный декремент и оператор больше. Условие можно переписать как while( (x--) > 0 )
🧐 Для чего нужна функция WinMain?

Функция WinMain является точкой входа в графические приложения в операционной системе Windows. Главная отличительная особенность отличающая её от обычной main заключается в том, что для графического приложения не будет выведено никакой консоли
🦾🧠🏋️Качаем мозги к лету!

Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.

➡️ Алгоритмы и структуры данных 35 990 ₽ 21 594

⭐️ Переходите и активируйте бесплатные вводные занятия курсаhttps://proglib.io/w/da6727d1

Вас ждут:

– 150 практических заданий и 47 видеолекций

– бессрочный доступ к обучению

– поддержка преподавателя в чате

А также очень харизматичный спикер из Яндекса 🙌🏻
🍔 Как распечатать все установленные переменные в CMake?

При использовании CMake часто возникает ситуация, когда поведение может отличаться от ожидаемого. Например установленная не та версия компилятора, стандарт C++ отличается от ожидаемого, проектные зависимости появившиеся неизвестно от куда. Один из способов решения — поискать проблему в установленных внешних переменных, для этого можно написать свой макрос (пример на картинке выше)
🍔 Как установить точность вывода в консоль для конкретной переменной

Для этого можно использовать вы можете связать функцию std::setprecision с переменной, для которой хотите установить точность

std::setprecision — функция из библиотеки iomanip (STL), которая устанавливает точность для вывода чисел с плавающей точкой. В аргументе std::setprecision задаётся количество цифр, которые мы хотим вывести
😱 Почему префиксный инкремент быстрее чем постфиксный?

Для постфиксного итератора неявно выделяется дополнительная память для хранения промежуточной переменной
🍔 Как преобразовать std::string в const char* или char*?

Если мы хотим передать std::string в функцию, которой требуется const char*, можно использовать .c_str()

Для получения неконстантной строки char*, вызываем .data(). Появилось в C++17, до этого можно было использовать &str[0]

‼️ Указатель становится недействительным, если строка уничтожается
🍔 Библиотека std::stacktrace

В C++23 появилась библиотека std::stacktrace для получения текущего стека вызовов функций,
а именно последовательность вызовов от точки входа main()

С помощью библиотеки можно посмотреть описание функции description() , исходный файл в котором находится функция source file() и номер строки source line()
🍔 Зачем нужен std::format?

❗️ В функция printf нет автоматического выведения типов, она подвержена ошибкам и не расширяема

❗️Потоковые объекты (stream) очень многословны и трудно оптимизируются

‼️ В C++20 появился std::format позволяющий форматировать строки в python стиле

🍔 Особенности std::format
• Безопасный для использования с разными типами (Type-safe)
• Поддерживает позиционные аргументы
• Расширяемость (поддержка пользовательских типов)
• Возвращает std::string
🍔 std::print() и std::println()

Если есть необходимость печатать в стандартный вывод и постоянно не пользоваться std::format, которая генерирует std::string, можно использовать функции std::print() и std::println(). Они были добавлены в C++23 и также поддерживают форматирование строк
😱 Что такое ошибка сегментации?

Ошибка сегментации (или segmentation fault) — вид ошибок связанный с обращением к памяти, которая не принадлежит процессу. Это вспомогательный механизм, который не дает вам «испортить» память и внедрить трудноотлаживаемые ошибки памяти. Когда вы получаете segfault, вы знаете, что делаете что-то не так с памятью — обращаетесь к переменной, которая уже была освобождена, записываете в часть памяти, доступную только для чтения, и т. д. Ошибка сегментации по сути одинакова в большинстве языков, позволяющих работать с памятью, принципиальной разницы между ошибками сегментации в C и C++ нет
🧨 Как очистить stringstream?

Для очистки содержимого строкового потока можно использовать
m.str("");

или
m.str(std::string());

что может быть более эффективно, из-за того что не вызываем конструктор std::string(const char*)
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
🍊 Что такое placement new?

Placement new - это специальный вид оператора new, который позволяет создать объект в уже выделенной памяти

char *buffer      = new char[1024];
string *str_point = new (buffer) string("hi"); // placement new


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

‼️ Следует учитывать, что деструкторы для таких объектов придётся вызывать вручную, потому что при освобождении памяти они автоматически не вызоваются
Что такое обрезка объектов?

Обрезка объектов (или object slicing) — это возможность присвоить объект класса-наследника экземпляру базового класса. Называется обрезкой, потому что часть информации исчезает (обрезается)

class Base {
int base_var;
};

class Derived: public Base {
int der_var;
};

int main () {
Derived der;
Base base = der;
}


❗️В примере информация об переменной der_var исчезает и её уже никак не восстановить

❗️Для решение проблемы можно использовать указатель или ссылку, тогда новый объект не создаётся, а мы просто пользуемся наследником как базовым
🍔 В чём разница между std::endl и '\n'?

Единственное существенное различие между std::endl и '\n' в том, что std::endl очищает буфер вывода и результат сразу выводится, а '\n' — это просто символ и сайдэффектов не имеет

Если программа требовательная к ресурсам, то стоит пользоваться '\n' и изредка вызывать std::flush для очистки буфера
🍔 Дополнительный код

Дополнительный код (или two's complement) — это умный способ хранения целых чисел, позволяющий очень легко реализовать распространенные математические задачи. В основном используется потому что легко представлять отрицательные числа

🥝 Основные принципы
- для нуля используем 0
- для положительных целых чисел используем значения от 1 и до 2 в степени (количество битов-1) минус 1
- для отрицательных чисел инвертируем бинарное представление и добавляем единицу — это и есть дополнительный код

🍎 Примеры (бинарное представление = значение)
• 0000 = 0
• 0001 = 1
• 0010 = 2
• 1111 = -1
• 1110 = -2
• 1101 = -3
🌳 Как объявить интерфейс в C ++?

В C++ интерфейсом можно считать класс с чисто виртуальными методами

Чисто виртуальный метод - это метод класса, который определяется как виртуальный и которому присваивается значение 0

class ITest
{
public:
virtual ~ITest() {}
virtual void Method() = 0;
};

class MainTest : public ITest
{
public:
virtual void Method() override
{
}
};