Изучаем C++. По вопросам сотрудничества: @adv_and_pr
reference_wrapper
reference_wrapper - это класс-обёртка для ссылок из заголовочного файла <functional>. Он позволяет передавать ссылки как значения.
Основное преимущество в том, что reference_wrapper ведёт себя как ссылка, но может копироваться как значение. Это избавляет от необходимости использовать указатели в подобных сценариях.
В этом примере мы передаем ссылку на переменную value в функцию process, используя std::ref для создания объекта std::reference_wrapper.
В функции process мы можем работать со ссылкой, как если бы она была передана напрямую, используя метод get() для получения самой ссылки.
Ключевое слово extern
Ключевое слово extern используется для объявления глобальных переменных и функций, реализация которых находится в другом модуле.
Это позволяет разделить интерфейс и реализацию.
Несмотря на разделение кода по файлам, при компиляции программы компоновщик свяжет объявление и реализацию вместе и позволит вызвать print() в main().
Видим цель, не видим препятствий: зовем на курс по архитектуре приложений 👨💻
Работа в проектах, где в коде не разобраться, похожа на путешествие по горной тропе без карты.
Возможно, этот островок кода выглядит не очень надежно и его можно удалить? Бам! — и всё, что могло упасть, упало.
Ситуация гипотетическая, сравнения взяты из реальной жизни — а мы хотели подвести к важности грамотного, выстроенного кода. Учим, как делать такую красоту, на курсе по архитектуре приложений, поток стартует 18 сентября.
Узнать программу вы можете на нашем сайте ✨
Что мы даем:
❓Понимание, что такое мышление архитектора.
📊Навыки создания чистого, управляемого проекта.
🔥Опыт и возможность совершить абсолютно все ошибки архитектора приложений в учебной среде.
Мы предусмотрели два варианта прохождения курса — Standart и Premium 🛍
Оба тарифа дают возможность присутствовать на встречах со спикерами, но в Premium вы попадете в закрытое сообщество студентов с преподавателями и получите подробное ревью вашего выполненного задания от ведущих. Старт — 18 сентября.
Выбрать свой тариф и присоединиться к группе вы можете по ссылке ⚡️
#вопросы_с_собеседований
Какие накладные расходы связаны с вызовом виртуальной функции?
При вызове виртуальной функции происходят следующие накладные расходы:
1. Поиск в таблице виртуальных функций (vtable):
для вызова виртуальной функции компилятор должен сначала получить указатель на нужную функцию из vtable класса. Это занимает некоторое время.
2. Невозможность инлайнинга:
тело виртуальной функции неизвестно на этапе компиляции, поэтому оптимизация инлайнинга для таких функций невозможна.
4. Затраты памяти на vtable:
для каждого класса с виртуальными функциями нужно хранить таблицу vtable, что увеличивает расход памяти.
Libusb
Libusb - это кросплатформенная библиотека для работы с USB-устройствами из приложений. Она позволяет обращаться к USB-устройствам, считывать и записывать данные, управлять конфигурацией устройств.
Libusb часто используется для создания приложений, которым нужно низкоуровневое USB-взаимодействие - драйверов устройств, утилит настройки оборудования, средств тестирования и отладки.
Этот код инициализирует libusb, открывает устройство по заданному VID/PID, читает данные bulk-передачей, обрабатывает их, и закрывает соединение с устройством.
Функция all_of
std::all_of - это алгоритм из стандартной библиотеки, который позволяет проверить, удовлетворяют ли все элементы диапазона какому-либо условию.
В примере мы создаем вектор целых чисел v и используем all_of, чтобы проверить, что все элементы больше нуля. Для этого передаем в all_of итераторы на начало и конец вектора, а также лямбда-функцию, которая проверяет, что элемент больше нуля.
#это_база
#вопросы_с_собеседований
В каком порядке инициализируются и уничтожаются члены класса?
Сначала вызываются конструкторы базовых классов в порядке наследования.
Затем инициализируются члены класса в порядке их объявления в классе.
После этого вызывается конструктор текущего класса.
Аналогичным образом происходит уничтожение объекта:
Сначала вызывается деструктор текущего класса.
Затем уничтожаются члены класса в порядке, обратном их инициализации.
Далее вызываются деструкторы базовых классов в обратном порядке наследования.
#вопросы_с_собеседований
Для чего нужен был тип std::auto_ptr<T>?
Тип std::auto_ptr<T> использовался для автоматического управления памятью и представляет собой умный указатель на объект типа T.
auto_ptr упрощает управление памятью и исключает утечки памяти из-за забытого вызова delete. Однако в современном C++ auto_ptr считается устаревшим и заменен на std::unique_ptr.
🤖 Вебинар: Разработка сетевого сервиса с помощью Boost.Asio
🔵14 августа в 20:00 мск открытый урок онлайн курса «C++ Developer. Professional» от OTUS.
Существует предвзятое мнение, что с C++ даже простую программу писать долго. Современный С++ и набор его библиотек легко могут опровергнуть это. За 40 минут практической части урока мы создадим настоящий сетевой сервис на языке C++ с использованием библиотеки Boost.Asio.
Этот урок будет полезен начинающим разработчикам на C++, которые хотят изучить создание сетевых сервисов, как клиентских частей, так и серверных.
🟠Это отличная возможность перенять опыт преподавателя и посмотреть на процесс обучения изнутри.
Оплата курса возможна любым удобным для вас способом.
➡️ Для участия в вебинаре зарегистрируйтесь: https://otus.pw/u5hC/Нативная интеграция. Информация о продукте www.otus.ru
#вопросы_с_собеседований
Что такое структуры и чем они отличаются от классов?
- Структуры по умолчанию имеют публичный доступ к полям, а в классах - приватный.
- Структуры копируются целиком при присваивании и передаче в функцию, классы - по ссылке.
- В структурах нет конструкторов по умолчанию, а в классах есть.
- Структуры чаще используются для простых данных, а классы - когда нужно более сложное поведение.
- Структуры не поддерживают наследование, в отличие от классов.
- Структуры можно создавать на стеке без оператора new, объекты класса только динамически.
Структуры эффективнее для маленьких объектов, классы дают больше гибкости и функционала за счет наследования и инкапсуляции.
Кортежи
Кортежи - это шаблонный контейнерный тип данных, позволяющий хранить набор элементов разных типов.
Доступ к элементам осуществляется по индексу через std::get, а типы элементов должны быть указаны при объявлении кортежа.
Кортежи удобно использовать для возврата нескольких значений из функции.
#это_база
👨💻 Хотите освоить лучшие инструменты по разработке микросервисной архитектуры?
Ответьте на 11 вопросов, чтобы проверить достаточно ли ваших навыков, чтобы строить архитектуру микросервисов и попасть на курс — «Microservice Architecture» от OTUS.
На полном курсе вы научитесь проектировать сложный бэкенд и работать с легаси-проектами, разбираться с трудными ситуациями и находить нестандартные решения. Все это на практике, с реальными кейсами и под руководством команды экспертов!
👉 Пройти тест — https://otus.pw/PkaVK/
💣 После прохождения у вас будет возможность записаться на курс по спец. цене и оформить рассрочку. А также вы получите доступ к записям 27 открытых уроков курса.
Реклама. Информация о рекламодателе на сайте www.otus.ru.
Один бот вместо тысячи каналов
Зачем подписываться на десятки каналов, если есть новостной бот AI Open News?
Он собирает актуальные посты из ваших любимых пабликов в персонализированную подборку. Можно читать ее, и не тратить время на лазанье по каналам.
И бот не заспамит вас уведомлениями — он высылает подборки только в установленное время. Чтобы читать перед сном или по пути на работу.
А еще он умеет составлять дайджесты из актуальных постов на любую тематику.
AI Open News удобнее каналов. Попробуйте 👉 @AiOpenNewsbot
std::pair
std::pair - это шаблон класса из стандартной библиотеки, который инкапсулирует пару значений разных типов.
Он часто используется для возврата нескольких значений из функции.
В этом примере getStats возвращает пару значений - сумму и среднее элементов массива. С помощью std::pair эти значения упаковываются в один возвращаемый объект. В main используется structured binding для распаковки пары в переменные sum и avg.
#вопросы_с_собеседований
Как и для чего используется метапрограммирование шаблонов?
Метапрограммирование шаблонов используется для генерации кода программы на этапе компиляции.
Это позволяет создавать высокооптимизированные гибкие библиотеки, которые адаптируются под конкретные типы во время компиляции за счет метапрограммирования шаблонов.
Основные способы метапрограммирования шаблонов:
- Шаблонные метапрограммы.
- Концепции.
- Типовые списки.
- constexpr if.
- Шаблонные рекурсивные алгоритмы.
Яндекс Практикум запустил бесплатный курс “Основы работы с Git”. Вы сможете полностью освоить популярную систему контроля версий кода за 20 часов.
Курс будет полезен тем, кто только погружается в разработку, и тем, кто не первый год пишет код:
— новички освоят инструменты, которые точно пригодятся в профессии;
— знатоки структурируют знания и повысят свою продуктивность.
На курсе вы научитесь:
— Писать код вместе с другими разработчиками и разработчицами;
— Отменять и откладывать изменения в своих ветках;
— Использовать локальный и удалённый репозиторий;
— Соединять ветки и разрешать конфликты;
— Управлять репозиторием через IDE и консоль;
— Понимать принципы и культуру командной разработки.
И освоите необходимые инструменты и технологии:
— GitHub;
— Terminal;
— GitHub Desktop;
— Bitbucket;
— GitBash;
— GitLab.
Переходите по ссылке и начинайте заниматься уже сейчас.
Реклама АНО ДПО "Образовательные технологии Яндекса", ИНН:7704282033, erid:LjN8KE8Ur
#вопросы_с_собеседований
В чем разница между статической и динамической библиотеками?
- Статические библиотеки компонуются с программой на этапе компиляции, а динамические подключаются во время выполнения программы.
- Из статической библиотеки в программу копируется только используемый код, а динамическая библиотека подключается целиком.
- Статические библиотеки увеличивают размер конечного файла программы, динамические - нет.
- Если статическая библиотека обновляется, нужно перекомпилировать программу. Для динамической библиотеки достаточно заменить файл библиотеки.
- Статические библиотеки предпочтительны, когда важна скорость выполнения, динамические - когда нужна гибкость и меньший размер программы.
std::sort
std::sort - это функция стандартной библиотеки для сортировки элементов в контейнерах, таких как вектор или список.
Чтобы использовать std::sort, нужно подключить заголовочный файл <algorithm>.
Метод принимает в качестве аргументов итераторы на начало и конец сортируемой последовательности и сортирует элементы в возрастающем порядке по умолчанию.
Для определения порядка сортировки можно указать свой компаратор.
#это_база
⚡️Бесплатный открытый урок по Machine Learning для начинающих.
Тема: Разведочный анализ данных на Python для Machine Learning.
Вебинар приурочен к старту онлайн-курса "Специализация Machine Learning".
Дата: 9 августа, 18:00
На занятии мы поговорим о том как проводить первичный анализ данных с использованием фреймворка Pandas. Расскажем об основных аспектах анализа данных. Научимся обрабатывать признаки и заполнять пропущенные значения.
После урока можно будет приобрести в рассрочку онлайн-курс "Специализация Machine Learning" и освоить востребованную профессию.
👉Регистрация на урок:
https://otus.pw/V41sN/
⚡️Сишарповец, апнуться — просто!
Начните на бесплатном вебинаре онлайн-курса «C# ASP.NET Core разработчик» — «ASP.NET: взаимодействие с источниками данных»: регистрация
На бесплатном занятии мы:
— познакомимся с видами баз данных;
— разберем, как работать с реляционными и нереляционными базами данных напрямую и через ORM.
🔥Экспертизой поделится Дмитрий Гурьянов — опытный Тимлид команды разработки CRM-решений на платформе .NET.
— Продолжить обучение после вебинара по спеццене можно на полном курсе, доступном также в рассрочку.
Нативная интеграция. Информация о продукте www.otus.ru
std::find
std::find - это алгоритм из стандартной библиотеки, который ищет элемент в контейнере.
Он принимает 3 аргумента:
- Итератор на начало контейнера
- Итератор на конец контейнера
- Искомое значение
И возвращает итератор на найденный элемент или итератор на конец, если элемент не найден.
В примере мы ищем элемент со значением 3 в векторе vec. std::find возвращает итератор на найденный элемент, по которому мы выводим значение.
Умные указатели в С++
Умные указатели - это шаблоны классов, которые позволяют автоматически управлять памятью и не допускать утечек.
Среди основных умных указателей:
- unique_ptr - указатель, который владеет объектом в единственном экземпляре.
- shared_ptr - указатель, у которого может быть несколько владельцев.
- weak_ptr - указатель на объект, владельцем которого является shared_ptr.
#это_база
Ключевое слово this
this используется для ссылки на текущий объект класса. Это слово инициализируется при создании объекта и доступно во всех методах объекта.
В примере в методе getArea() используется this для доступа к переменным width и height текущего объекта rect.
Результат работы программы:
Площадь: 12
#это_база
new или malloc()?
Рекомендуется использовать оператор new вместо функции malloc из Си, так как new обеспечивает дополнительную функциональность и безопасность:
- new автоматически вызывает конструктор объекта, malloc - нет.
- new возвращает типизированный указатель, malloc - void*.
- new выбрасывает исключение при ошибке, malloc - возвращает NULL.
- объекты, созданные через new, автоматически уничтожаются при удалении, malloc - нет.
⚡️Сишарповец, пора расти дальше!
Узнайте больше про C# ASP.NET Core-разработку ЗАВТРА, 3 августа в 20:00 мск на бесплатном вебинаре онлайн-курса в Отус — «Стандартные middleware своими руками»: регистрация
На бесплатном занятии мы:
— изучим, какие middleware по умолчанию используются в ASP.NET проектах;
— узнаем, зачем они нужны, как они устроены;
— реализуем свои аналоги.
🔥Экспертизой поделится Антон Герасименко — опытный .net developer + lead.
— После вебинара вы сможете продолжить обучение по спеццене, оплатив курс, в том числе, в рассрочку.
Нативная интеграция. Информация о продукте www.otus.ru
#вопросы_с_собеседований
В чем разница между ссылочными переменными и указателями?
Ссылка - это псевдоним объекта, альтернативное имя уже существующего объекта.
Указатель - переменная, хранящая адрес другой переменной.
Ссылка должна инициализироваться при объявлении и не может иметь нулевое значение, в отличие от указателя, способного иметь значение NULL.
Ссылка не может быть переприсвоена другому объекту после инициализации.
Указатель можно перенаправить на другой объект.
Ссылка не хранит адрес объекта, она просто становится еще одним именем объекта.
Указатель явно хранит адрес в памяти.
Ссылка всегда должна ссылаться на валидный объект.
Указатель может висеть в воздухе.
std::begin() и std::end()
Функции std::begin() и std::end() из заголовочного файла <iterator> используются для получения итераторов на начало и конец контейнера соответственно.
Это часто нужно при работе с алгоритмами STL.
В примере std::begin() вернёт итератор на первый элемент контейнера, а std::end() - на позицию за последним элементом.
Эти функции работают со всеми стандартными контейнерами (vector, list, array и т.д.) и позволяют универсально перебирать их элементы.
nullptr
nullptr - это ключевое слово, которое используется для обозначения null-указателя (указателя, который не ссылается ни на какой объект).
Основные моменты, которые нужно знать о nullptr:
- nullptr предпочтительнее использовать вместо старого способа обозначения null-указателя - константы 0 или NULL.
- nullptr гарантированно преобразуется в любой тип указателя.
- Использование nullptr позволяет избежать ошибок по сравнению с константами вроде NULL и делает код более читабельным.
В примере мы проверяем указатель ptr на равенство nullptr.
#это_база
#вопросы_с_собеседований
Каковы спецификаторы доступа в C++?
Спецификаторы доступа позволяют инкапсулировать данные класса и ограничивать интерфейс взаимодействия с объектами.
Это важный инструмент ООП для сокрытия внутренней реализации и предоставления только необходимого уровня доступа извне.
В C++ определены следующие спецификаторы доступа:
public - объявленные таким образом данные и методы класса доступны из любого места программы.
protected - защищенные данные и методы доступны только из самого класса и его подклассов.
private - закрытые элементы доступны только из тела самого класса, где они определены.
Кроме того, есть спецификатор default - когда явный спецификатор доступа не указан. Такие элементы доступны только из текущего класса и друзей.
set::erase()
Функция set::erase() используется для удаления элементов из контейнера set.
set::erase() принимает значение, которое нужно удалить, в качестве аргумента и удаляет из set все элементы, эквивалентные переданному значению.
Если такого значения нет в set, не делает ничего.
В этом примере создается set целых чисел, добавляются значения от 1 до 5. Затем вызывается numbers.erase(3) - это удалит элемент со значением 3 из set.
#это_база