#вопросы_с_собеседований
Как работает механизм перегрузки операторов в C++ и какие ограничения существуют при его использовании?
В C++, перегрузка операторов позволяет программистам определять поведение стандартных операторов (например, +, -, *, /) для пользовательских типов данных. Это делается путем определения функций или методов класса с специальным именем: operatorX, где X - это оператор, который нужно перегрузить. Однако существуют ограничения: нельзя перегружать операторы для встроенных типов данных (только если одним из операндов является пользовательский тип), нельзя создавать новые операторы, и некоторые операторы (например, ?:, .) не подлежат перегрузке. Перегрузка операторов должна использоваться с осторожностью, чтобы не нарушить интуитивные ожидания от работы этих операторов.
Как работает механизм перегрузки операторов в C++ и какие ограничения существуют при его использовании?
Принцип DRY
Принцип DRY (Don't Repeat Yourself) — это основной принцип программирования, который призывает избегать дублирования кода. Этот принцип подразумевает, что каждая часть информации или логики должна существовать в системе только в одном месте. В контексте С++ принцип DRY означает, что вы должны избегать повторения кода, функций, классов или любых других конструкций.
#для_продвинутых
Принцип DRY (Don't Repeat Yourself) — это основной принцип программирования, который призывает избегать дублирования кода. Этот принцип подразумевает, что каждая часть информации или логики должна существовать в системе только в одном месте. В контексте С++ принцип DRY означает, что вы должны избегать повторения кода, функций, классов или любых других конструкций.
#для_продвинутых
std::lock_guard
Прежде всего, мьютекс (mutex) — это механизм синхронизации, который предоставляет эксклюзивный доступ к разделяемым данным одному потоку в данный момент времени.
#для_продвинутых
std::lock_guard
— это один из классов в стандартной библиотеке C++, предназначенных для обеспечения многопоточной безопасности при работе с разделяемыми данными. Он используется для автоматического захвата и освобождения мьютекса (mutex) при входе и выходе из блока кода.Прежде всего, мьютекс (mutex) — это механизм синхронизации, который предоставляет эксклюзивный доступ к разделяемым данным одному потоку в данный момент времени.
std::lock_guard
является удобной оберткой для работы с мьютексами.#для_продвинутых
Принцип lock-free
Принцип lock-free (без блокировок) в С++ относится к методам многопоточного программирования, которые позволяют избегать использования блокировок (locks) для обеспечения безопасности доступа к данным из нескольких потоков.
Основная идея lock-free программирования заключается в том, чтобы позволить нескольким потокам одновременно работать с общими данными без блокировки выполнения одного или нескольких потоков.
Однако стоит отметить, что написание lock-free кода может быть сложным и требовать более глубокого понимания атомарных операций и алгоритмов.
#для_продвинутых
Принцип lock-free (без блокировок) в С++ относится к методам многопоточного программирования, которые позволяют избегать использования блокировок (locks) для обеспечения безопасности доступа к данным из нескольких потоков.
Основная идея lock-free программирования заключается в том, чтобы позволить нескольким потокам одновременно работать с общими данными без блокировки выполнения одного или нескольких потоков.
Однако стоит отметить, что написание lock-free кода может быть сложным и требовать более глубокого понимания атомарных операций и алгоритмов.
#для_продвинутых
Undefined behavior
Undefined behavior может возникать из-за различных причин, например делением на ноль, доступом к невыделенной памяти, выходом за пределы массива или использованием неинициализированных переменных.
#для_начинающих
Undefined behavior
(неопределенное поведение) — это концепция в C++, которая означает, что результат выполнения определенного кода программы не определен и может быть непредсказуемым. Это означает, что в случае наличия undefined behavior
в программе нельзя надеяться на какие-либо гарантированные результаты, и программа может вести себя по-разному в разных средах выполнения или даже в разные моменты времени.Undefined behavior может возникать из-за различных причин, например делением на ноль, доступом к невыделенной памяти, выходом за пределы массива или использованием неинициализированных переменных.
#для_начинающих
Дружественные функции
Дружественные функции (friend functions) — это функции, которые объявлены как дружественные внутри класса и имеют доступ к закрытым и защищенным членам этого класса. Это позволяет функциям, которые не являются методами класса, работать с его данными. Дружественные функции объявляются с использованием ключевого слова friend внутри определения класса.
Использование дружественных функций следует ограничивать в тех случаях, когда это действительно необходимо, так как это может нарушать инкапсуляцию данных и сделать код менее структурированным и управляемым.
#для_начинающих
Дружественные функции (friend functions) — это функции, которые объявлены как дружественные внутри класса и имеют доступ к закрытым и защищенным членам этого класса. Это позволяет функциям, которые не являются методами класса, работать с его данными. Дружественные функции объявляются с использованием ключевого слова friend внутри определения класса.
Использование дружественных функций следует ограничивать в тех случаях, когда это действительно необходимо, так как это может нарушать инкапсуляцию данных и сделать код менее структурированным и управляемым.
#для_начинающих
Принцип YAGNI
Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».
В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.
Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#для_продвинутых
Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».
В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.
Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#для_продвинутых
#вопросы_с_собеседований
Что такое флажки компиляции?
Флажки компиляции — это специальные опции, которые можно указать при компиляции кода, чтобы включить или отключить определенные возможности языка или библиотек.
Используя разные комбинации флажков, можно тонко настроить процесс компиляции под нужды конкретного проекта.
Например:
— std=c++11: включает поддержку стандарта C++11.
— O2: включает оптимизацию кода на уровне O2.
— g: добавляет отладочную информацию в скомпилированный файл.
— Wall: включает предупреждения обо всех возможных ошибках.
— DDEBUG: определяет макрос DEBUG, чтобы можно было использовать условную компиляцию.
— I<path>: добавляет директорию по указанному пути в поиск заголовочных файлов.
Что такое флажки компиляции?
Используя разные комбинации флажков, можно тонко настроить процесс компиляции под нужды конкретного проекта.
Например:
— std=c++11: включает поддержку стандарта C++11.
— O2: включает оптимизацию кода на уровне O2.
— g: добавляет отладочную информацию в скомпилированный файл.
— Wall: включает предупреждения обо всех возможных ошибках.
— DDEBUG: определяет макрос DEBUG, чтобы можно было использовать условную компиляцию.
— I<path>: добавляет директорию по указанному пути в поиск заголовочных файлов.
#вопросы_с_собеседований
Зачем нужен виртуальный деструктор?
Для того, чтобы избежать утечки ресурсов и другого неконтролируемого поведения объекта.
Без ключевого слова virtual у родительского класса Base деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только ~Base():
Зачем нужен виртуальный деструктор?
Для того, чтобы избежать утечки ресурсов и другого неконтролируемого поведения объекта.
Без ключевого слова virtual у родительского класса Base деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только ~Base():
Hello from ~Base()
string at()
std::string::at можно использовать для извлечения символов по символам из заданной строки.
Подробнее ознакомиться можно здесь.
std::string::at можно использовать для извлечения символов по символам из заданной строки.
Подробнее ознакомиться можно здесь.
Call Stack Logger — инструментирование функций как способ отслеживания потока выполнения программы
Доводилось ли вам когда-нибудь работать над C++ проектом с такой огромной кодовой базой, что понимание того, что на самом деле происходит во время выполнения программы, требует кучи времени и сил?
Смотреть статью
Доводилось ли вам когда-нибудь работать над C++ проектом с такой огромной кодовой базой, что понимание того, что на самом деле происходит во время выполнения программы, требует кучи времени и сил?
Смотреть статью
Хабр
Call Stack Logger — инструментирование функций как способ отслеживания потока выполнения программы
Введение Доводилось ли вам когда-нибудь работать над C++ проектом с такой огромной кодовой базой, что понимание того, что на самом деле происходит во время выполнения программы, требует кучи времени и...
Строковые литералы как параметры шаблона
Начиная с C ++ 20, вы можете использовать строку в качестве параметра шаблона, не являющегося типом. Идея состоит в том, чтобы использовать стандартную строку basic_fixed_string, которая имеет конструктор constexpr. Конструктор constexpr позволяет ему создать экземпляр фиксированной строки во время компиляции.
Вроде бы мелочь, а приятно — не нужно производить обходных маневров и использовать лишнюю память.
Начиная с C ++ 20, вы можете использовать строку в качестве параметра шаблона, не являющегося типом. Идея состоит в том, чтобы использовать стандартную строку basic_fixed_string, которая имеет конструктор constexpr. Конструктор constexpr позволяет ему создать экземпляр фиксированной строки во время компиляции.
Вроде бы мелочь, а приятно — не нужно производить обходных маневров и использовать лишнюю память.
Генератор G-кода для 3D-принтеров (RepRap, Makerbot, Ultimaker и др.).
https://www.libhunt.com/r/PrusaSlicer
https://www.libhunt.com/r/PrusaSlicer
Libhunt
PrusaSlicer Alternatives and Reviews
Which is the best alternative to PrusaSlicer? Based on common mentions it is: AltStore, Ohmyzsh, Cura, Kiauh, OctoPrint, KevinOConnor/Klipper or SuperSlicer