Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены?
в C++ выбрасывать исключения из конструктора можно. Это обычно делается, когда в процессе инициализации объекта происходит ошибка, и объект не может быть корректно сконструирован.
Если исключение выбрасывается из конструктора, то все поля, которые были успешно сконструированы до момента выброса исключения, будут корректно разрушены. Это гарантируется механизмом исключений в C++.
Важно помнить, что только те поля, которые были успешно сконструированы, будут разрушены. Если исключение выбрасывается в процессе конструирования поля, то это поле не будет разрушено, так как его конструктор не был успешно завершен.
#вопросы_с_собеседований
в C++ выбрасывать исключения из конструктора можно. Это обычно делается, когда в процессе инициализации объекта происходит ошибка, и объект не может быть корректно сконструирован.
Если исключение выбрасывается из конструктора, то все поля, которые были успешно сконструированы до момента выброса исключения, будут корректно разрушены. Это гарантируется механизмом исключений в C++.
Важно помнить, что только те поля, которые были успешно сконструированы, будут разрушены. Если исключение выбрасывается в процессе конструирования поля, то это поле не будет разрушено, так как его конструктор не был успешно завершен.
#вопросы_с_собеседований
Позднее связывание
Позднее связывание (или динамическое связывание) — это концепция в C++, которая связывает вызов метода с его реализацией во время выполнения программы, а не на этапе компиляции. Это позволяет достичь полиморфизма и инкапсуляции, так как объекты могут вызывать методы, которые будут разрешены на основе их фактического типа, а не только статического типа.
В C++ позднее связывание реализуется с помощью виртуальных функций и ключевого слова virtual. Виртуальные функции определяются в базовом классе и могут быть переопределены в производных классах. Когда вы вызываете виртуальную функцию через указатель или ссылку на базовый класс, вызывается соответствующая реализация в производном классе на основе реального типа объекта.
#код
Позднее связывание (или динамическое связывание) — это концепция в C++, которая связывает вызов метода с его реализацией во время выполнения программы, а не на этапе компиляции. Это позволяет достичь полиморфизма и инкапсуляции, так как объекты могут вызывать методы, которые будут разрешены на основе их фактического типа, а не только статического типа.
В C++ позднее связывание реализуется с помощью виртуальных функций и ключевого слова virtual. Виртуальные функции определяются в базовом классе и могут быть переопределены в производных классах. Когда вы вызываете виртуальную функцию через указатель или ссылку на базовый класс, вызывается соответствующая реализация в производном классе на основе реального типа объекта.
#код
Статически подсчитываем количество экземпляров шаблона с нулевым временем выполнения и даже без использования стандартной библиотеки.
Смотреть код
Смотреть код
Ключевое слово const
Ключевое слово const используется для создания констант и неизменяемых объектов.
— Const для объявления переменных: запрещает изменение объекта после инициализации.
— Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.
— Функции, возвращающие const значения: гарантируют, что функция не изменит объект.
— Const члены класса: нельзя изменить через объект класса.
— Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#код
Ключевое слово const используется для создания констант и неизменяемых объектов.
— Const для объявления переменных: запрещает изменение объекта после инициализации.
— Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.
— Функции, возвращающие const значения: гарантируют, что функция не изменит объект.
— Const члены класса: нельзя изменить через объект класса.
— Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#код
Очередной #дайджест по С++:
✍️ Что в DI-Контейнере твоем, С++? Пробуем написать
Разбор DI-контейнеров на C++.
✍️ Установка OpenCV под Windows
В данной статье описан способ сборки OpenCV из исходников с помощью cmake и Microsoft Visual Studio, и пример запуска своего проекта на cmake.
✍️ Краткий обзор нововведений C++23: deducing this
Документ «deducing this», принятый в последний стандарт C++, вводит новый, третий тип методов классов, сочетающий в себе свойства двух уже существующих: нестатических и статических, открывающий перед нами новые горизонты.
✍️ Регулятор нагрузки
Данный регулятор управляется при помощи arduino и симисторного выхода.
✍️ Компилируем быстрые консольные .exe приложения на PHP 8.1 в 2023 году, а почему бы и нет?
С каждым релизом PHP становится всё быстрее, а при включении JIT (Just-In-Time) компиляции достигает почти отметок того же C.
✍️ Что в DI-Контейнере твоем, С++? Пробуем написать
Разбор DI-контейнеров на C++.
✍️ Установка OpenCV под Windows
В данной статье описан способ сборки OpenCV из исходников с помощью cmake и Microsoft Visual Studio, и пример запуска своего проекта на cmake.
✍️ Краткий обзор нововведений C++23: deducing this
Документ «deducing this», принятый в последний стандарт C++, вводит новый, третий тип методов классов, сочетающий в себе свойства двух уже существующих: нестатических и статических, открывающий перед нами новые горизонты.
✍️ Регулятор нагрузки
Данный регулятор управляется при помощи arduino и симисторного выхода.
✍️ Компилируем быстрые консольные .exe приложения на PHP 8.1 в 2023 году, а почему бы и нет?
С каждым релизом PHP становится всё быстрее, а при включении JIT (Just-In-Time) компиляции достигает почти отметок того же C.
Сколько лет опыта по вашему должен иметь мидл?
#интерактив
#интерактив
std::tuple
std::tuple — это шаблонный класс, представляющий собой фиксированный набор элементов разных типов. Проще говоря, удобный инструмент для упаковки данных разных типов
Элементы tuple инициализируются в конструкторе и доступны только для чтения после создания.
tuple часто используется в комбинации с tie для присваивания кортежа переменным.
#код
std::tuple — это шаблонный класс, представляющий собой фиксированный набор элементов разных типов. Проще говоря, удобный инструмент для упаковки данных разных типов
Элементы tuple инициализируются в конструкторе и доступны только для чтения после создания.
tuple часто используется в комбинации с tie для присваивания кортежа переменным.
#код
Что такое рефакторинг?
Рефакторинг — это процесс изменения внутренней структуры программы без изменения ее внешнего поведения.
Рефакторинг кода может применяться в следующих ситуациях:
— Улучшение читаемости и понятности кода.
— Оптимизация производительности.
— Устранение дублирования кода.
Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
#вопросы_с_собеседований
Рефакторинг — это процесс изменения внутренней структуры программы без изменения ее внешнего поведения.
Рефакторинг кода может применяться в следующих ситуациях:
— Улучшение читаемости и понятности кода.
— Оптимизация производительности.
— Устранение дублирования кода.
Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
#вопросы_с_собеседований
Паттерн Strategy
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.
Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.
Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
lmdeploy
LMDeploy — это набор инструментов для сжатия, развертывания и обслуживания LLM.
Открыть страницу
LMDeploy — это набор инструментов для сжатия, развертывания и обслуживания LLM.
Открыть страницу
Сколько лет опыта по вашему должен иметь синьор?
#интерактив
#интерактив
RCU (Read-Copy-Update)
RCU (Read-Copy-Update) — это механизм синхронизации доступа к данным в многопоточных приложениях. Он позволяет избежать блокировок при чтении данных, делая копию для чтения и обновляя оригинал после того, как все чтения завершены.
RCU особенно полезен, когда чтение данных происходит гораздо чаще, чем запись.
В примере мы сначала берем rcu_read_lock, чтобы защитить чтение foo. В другом потоке происходит модификация foo с помощью rcu_assign_pointer, которая делает копию данных, а оригинал удаляется после synchronize_rcu.
Таким образом чтение в первом потоке происходит без блокировок и избегает конфликтов с изменением данных в другом потоке. RCU гарантирует, что указатель foo будет виден как старое значение в первом потоке.
#код
RCU (Read-Copy-Update) — это механизм синхронизации доступа к данным в многопоточных приложениях. Он позволяет избежать блокировок при чтении данных, делая копию для чтения и обновляя оригинал после того, как все чтения завершены.
RCU особенно полезен, когда чтение данных происходит гораздо чаще, чем запись.
В примере мы сначала берем rcu_read_lock, чтобы защитить чтение foo. В другом потоке происходит модификация foo с помощью rcu_assign_pointer, которая делает копию данных, а оригинал удаляется после synchronize_rcu.
Таким образом чтение в первом потоке происходит без блокировок и избегает конфликтов с изменением данных в другом потоке. RCU гарантирует, что указатель foo будет виден как старое значение в первом потоке.
#код
Очередной #дайджест по С++:
🤖 Circle может стать будущим C++
Один простой трюк, позволяющий освободить творческие способности в эволюции языка C++.
🤖 AgentBench
Комплексный тест для оценки LLM как агентов.
🤖 fuzzing
Учебники, примеры, обсуждения, исследовательские предложения и другие ресурсы, связанные с фаззингом.
🤖 Моделирование трубы в реальном времени
Создание полноценной симуляции.
🤖 Circle может стать будущим C++
Один простой трюк, позволяющий освободить творческие способности в эволюции языка C++.
🤖 AgentBench
Комплексный тест для оценки LLM как агентов.
🤖 fuzzing
Учебники, примеры, обсуждения, исследовательские предложения и другие ресурсы, связанные с фаззингом.
🤖 Моделирование трубы в реальном времени
Создание полноценной симуляции.
std::size
std::size — это функция из стандартной библиотеки C++, которая возвращает размер контейнера или массива.
Она определена в заголовочном файле, работает со всеми стандартными контейнерами (vector, deque, list, array и др.) и с массивами всех типов, позволяя получить размер контейнера или массива в runtime.
#код
std::size — это функция из стандартной библиотеки C++, которая возвращает размер контейнера или массива.
Она определена в заголовочном файле, работает со всеми стандартными контейнерами (vector, deque, list, array и др.) и с массивами всех типов, позволяя получить размер контейнера или массива в runtime.
#код
Изучите C++: введение для начинающих
В этом коротком посте автор знакомит читателей с основами C++ и помогает заложить прочную основу для начала пути в программировании.
Читать статью
В этом коротком посте автор знакомит читателей с основами C++ и помогает заложить прочную основу для начала пути в программировании.
Читать статью
🎓💼 ТОП-9 не самых очевидных компаний для стажировки в ИТ
Везде просят опыт работы... Но где его взять? Как раз об этом сейчас и расскажем!
🔗Читать статью
🔗Зеркало
Везде просят опыт работы... Но где его взять? Как раз об этом сейчас и расскажем!
🔗Читать статью
🔗Зеркало
Как тестировать закрытые методы?
Проверка закрытых методов в C++ может быть осуществлена путем написания тестовых случаев, которые используют публичные методы, которые в свою очередь вызывают закрытые методы. Этот подход называется "тестирование черного ящика" и позволяет тестировать функциональность закрытых методов, не раскрывая их реализацию.
#вопросы_с_собеседований
Проверка закрытых методов в C++ может быть осуществлена путем написания тестовых случаев, которые используют публичные методы, которые в свою очередь вызывают закрытые методы. Этот подход называется "тестирование черного ящика" и позволяет тестировать функциональность закрытых методов, не раскрывая их реализацию.
#вопросы_с_собеседований
Перегрузка операторов
Перегрузка операторов позволяет определить для объектов классов встроенные операторы, такие как +, -, * и т. д. Для определения оператора для объектов своего класса, необходимо определить функцию, название которой содержит слово operator и символ перегружаемого оператора.
В этом примере в классе Counter определен оператор сложения, цель которого сложить два объекта Counter. Текущий объект будет представлять левый операнд операции. Объект, который передается в функцию через параметр counter, будет представлять правый операнд операции.
#код
Перегрузка операторов позволяет определить для объектов классов встроенные операторы, такие как +, -, * и т. д. Для определения оператора для объектов своего класса, необходимо определить функцию, название которой содержит слово operator и символ перегружаемого оператора.
В этом примере в классе Counter определен оператор сложения, цель которого сложить два объекта Counter. Текущий объект будет представлять левый операнд операции. Объект, который передается в функцию через параметр counter, будет представлять правый операнд операции.
#код
Исследование различий между C++ и C: почему C++ преобладает
Оба языка известны своей эффективностью, универсальностью и необузданной мощью. Однако C++ постепенно одерживает верх во многих областях, что делает его более выгодным выбором для разработки современного программного обеспечения.
Читать статью
Оба языка известны своей эффективностью, универсальностью и необузданной мощью. Однако C++ постепенно одерживает верх во многих областях, что делает его более выгодным выбором для разработки современного программного обеспечения.
Читать статью
Libcurl
Libcurl — это библиотека для передачи файлов с множественным протоколом, которая поддерживает огромное множество протоколов. Также Libcurl поддерживает сертификаты SSL, HTTP POST, HTTP PUT, загрузку FTP, загрузку на основе форм HTTP и многое другое.
В этом примере создается объект CURL, затем вызывается curl_easy_init для его инициализации. Затем устанавливаются опции CURLOPT_URL и CURLOPT_WRITEFUNCTION с помощью curl_easy_setopt.
— CURLOPT_URL указывает URL-адрес для выполнения GET запроса.
— CURLOPT_WRITEFUNCTION указывает функцию обратного вызова для записи данных ответа.
Затем вызывается curl_easy_perform для выполнения запроса. После завершения запроса вызывается curl_easy_cleanup для очистки объекта CURL, а затем curl_global_cleanup для очистки глобальных ресурсов libcurl.
Результат выполнения этого кода — вывод содержимого страницы в стандартный вывод.
#код
Libcurl — это библиотека для передачи файлов с множественным протоколом, которая поддерживает огромное множество протоколов. Также Libcurl поддерживает сертификаты SSL, HTTP POST, HTTP PUT, загрузку FTP, загрузку на основе форм HTTP и многое другое.
В этом примере создается объект CURL, затем вызывается curl_easy_init для его инициализации. Затем устанавливаются опции CURLOPT_URL и CURLOPT_WRITEFUNCTION с помощью curl_easy_setopt.
— CURLOPT_URL указывает URL-адрес для выполнения GET запроса.
— CURLOPT_WRITEFUNCTION указывает функцию обратного вызова для записи данных ответа.
Затем вызывается curl_easy_perform для выполнения запроса. После завершения запроса вызывается curl_easy_cleanup для очистки объекта CURL, а затем curl_global_cleanup для очистки глобальных ресурсов libcurl.
Результат выполнения этого кода — вывод содержимого страницы в стандартный вывод.
#код