11482
Изучаем C++. По вопросам сотрудничества: @adv_and_pr РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Виртуальные функции
Виртуальные функции — это механизм, позволяющий создавать функции в базовом классе, которые могут быть переопределены в производных классах. Основная идея заключается в том, что виртуальные функции могут вызывать методы из объектов производных классов через указатели или ссылки на базовый класс, и при этом будет вызвана та версия функции, которая соответствует реальному типу объекта.
Чтобы объявить функцию виртуальной, необходимо использовать ключевое слово virtual в определении функции в базовом классе. Производные классы могут переопределять виртуальные функции с помощью того же ключевого слова virtual. Таким образом, при вызове виртуальной функции через указатель или ссылку на базовый класс будет вызвана версия функции из реального типа объекта.
Что такое memory leak?Memory leak (утечка памяти) — это ситуация, при которой программа использует динамическую память, но забывает освободить эту память перед завершением работы или перед повторным использованием. Как результат, выделенная память остается занята в оперативной памяти, несмотря на то, что она уже не используется, и таким образом происходит утечка памяти.
Утечка памяти может привести к постепенному увеличению объема занятой оперативной памяти программой. Если утечка продолжает развиваться, это может привести к уменьшению производительности программы и даже к завершению программы из-за нехватки доступной памяти.
Константные методы
В C++, ключевое слово const имеет различное значение в зависимости от контекста. Оно может быть применено к методам классов для указания, что метод не будет изменять состояние объекта, на котором он вызывается. Такие методы называются «константными методами».
Когда вы вызываете константный метод для объекта класса, компилятор гарантирует, что внутри этого метода вы не будете изменять члены данных объекта, кроме членов, объявленных как mutable (они могут изменяться внутри константных методов).
Использование выражений сгиба
С C++17 мы можем использовать складывать выражения для объединения последовательности std::arrays, это элегантное и эффективное решение продемонстрировано выше.
#вопросы_с_собеседований
Как работает оператор new в C++ и почему используется именно этот оператор для выделения динамической памяти?
Оператор new используется в C++ для выделения динамической памяти (heap memory), которая выделяется во время выполнения программы. При его вызове, сначала выделяется необходимое количество памяти из операционной системы, а затем возвращается указатель на эту область памяти.
При исполнении оператора new происходит следующее:
1. Сначала он выделяет память в размере, указанном в аргументе оператора или размере типа данных, на который указывает указатель.
2. Затем он вызывает конструктор для создания объекта в выделенной области памяти.
3. Возвращает указатель на выделенную память.
Оператор new является предпочтительным для выделения памяти по сравнению с функцией malloc в C, поскольку он позволяет при выделении памяти автоматически вызывать конструкторы объектов. С использованием оператора new не нужно явно выделять память под объекты и вызывать конструкторы отдельно.
В данном примере оператор new выделяет память под объект класса MyClass и вызывает его конструктор. Оператор delete используется для освобождения ранее выделенной памяти.
Является ли число степенью двойки
Мы можем проверить, является ли число степенью двойки или нет напрямую, используя код выше.
Алгоритм move
Синтаксис:
std :: move (first, last, result);
Перемещает элементы диапазона [first,last) в диапазон, начиная с позиции result.
Значение элементов в [first,last) массиве передается элементам, на которые указывает result. После вызова элементы в диапазоне [first,last) остаются в неопределенном, но допустимом состоянии.
Неиспользуемые переменные
Подобный макрос есть, например, в cocos2d-x, там он называется CC_UNUSED_PARAM. Из недостатков: теоретически, он может работать не на всех компиляторах. Тем не менее, в cocos2d-x он для всех платформ определен абсолютно одинаково.
Для чего? Этот макрос позволяет избежать предупреждения о неиспользуемой переменной, а читающему код он как бы говорит: «тот кто писал это — знал, что переменная не используется, все в порядке».
Преобразование типа с плавающей точкой в целочисленный
Язык C++ не предоставляет примитивную операцию округления чисел с плавающей точкой. Самым простым методом преобразования числа с плавающей точкой x в ближайшее целое число n будет оператор(см на картинке).
Используя такой метод, если x будет точно посередине между двумя целыми числами, то n будет округлено в большую сторону. Например, 0,5 -> 1; 1,5 -> 2; -0,5 -> 0; -1,5 -> -1.
Алгоритм mismatch
Сравнивает две последовательности и находит первую позицию, где элементы различны.
Возвращается пара итераторов, каждый из которых указывает на эту позицию в соответствующей последовательности.
Если все элементы одинаковы, то каждый итератор в паре указывает на элемент last в своем контейнере.
Некоторые различия между ссылками и указателями
1. Указатель может быть объявлен void, а ссылка - никогда. Пример на картинке.
2. Переменная-указатель может иметь несколько уровней вложенности, то есть, например, бывают одиночные указатели, двойные указатели, тройные указатели. Ссылка же имеет только один единственный уровень вложенности.
3. Ссылочная переменная не может быть обновлена.
Алгоритм unique_copy
std::unique используется для удаления дубликатов любого элемента, присутствующего последовательно в диапазоне [первый, последний). Он выполняет эту задачу для всех подгрупп, присутствующих в диапазоне, в котором последовательно присутствует один и тот же элемент.
Но что, если мы не хотим изменять исходный диапазон, а просто хотим, чтобы результат std::unique был скопирован в другой контейнер, для этого у нас есть другая функция std::unique_copy() . При этом копируется только первый элемент из каждой последовательной группы эквивалентных элементов в диапазоне [first, last).
Собеседование Middle C++
Интервью на позицию Middle C++ разработчика
Смотреть видео
Cocos2D-X
Библиотека предназначена для упрощения разработки мобильных игр. Пользователи отмечают её доступность, простоту использования и наличие специального конструктора на основе Cocos Creator. Кстати, с использованием этой библиотеки была разработана игра Badland.
Если в игру планируется добавление большого количество анимации и графики, то лучше использовать Unity, который позволяет интегрировать файлы из таких программ, как Photoshop, Maya или Blender.
Подробнее можно ознакомиться здесь.
-->«оператор»
Вы можете использовать
-->«оператор» в цикле while в качестве оператора «Переход к».
Например, вы можете печатать числа 7 6 5 4 3 2 1 с помощью цикла while следующим образом.
Примечание:
--> на самом деле это не оператор, а комбинация двух операторов --и >. Вышеупомянутое while то же самое while( (x--) > 0 ), что читается как «уменьшить x на 1, а затем сравнить результат с 0».
Перегрузка функций
Перегрузка функций — это возможность определения нескольких функций с одним и тем же именем, но разными параметрами. Когда вызывается такая функция, компилятор определяет, какая из перегруженных функций должна быть вызвана, основываясь на типах аргументов, переданных при вызове.
Таким образом можно создать несколько вариантов функции, которые выполняют аналогичные действия, но принимают разные типы аргументов. Это позволяет создавать более удобный и интуитивно понятный интерфейс для программистов, так как они могут вызывать одно и то же имя функции с разными типами данных, не заботясь о различиях в именах функций.
❓ Знаете, что делает код на C++ мощным? Правильная работа с библиотеками!
👉 Если вы хотите стать востребованным C++ разработчиком, пора прокачивать навыки работы с библиотеками. Это ваш ключ к написанию профессионального и оптимизированного кода!
Что вас ждет на открытом уроке:
- узнаете, какие бывают библиотеки и чем они отличаются;
- научитесь подключать сторонние библиотеки и собирать свои;
- поймете, как библиотеки упрощают вашу работу и делают код эффективнее.
⭐️ Спикер Денис Злобин — старший инженер-программист в Astra Linux, опытный наставник разработчиков.
⏰ 18 декабря в 19:00 мск. Для начинающих и Junior-разработчиков, готовых к карьерному росту. Вебинар проходит в преддверии старта курса «C++ Developer», участники урока получат скидку на большое обучение.
👉 Для участия зарегистрируйтесь: https://otus.pw/q5mM/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
std::initializer_list
Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, как это можно делать с C-массивами.
Это справедливо и для вложенных контейнеров. Скажите спасибо С++11.
memmove
Функция memmove используется для копирования блока памяти из одного места в другое. Она объявлена в заголовочном файле <cstring>. Она принимает аргументы типа void * и const void *, что позволяет ей работать с любыми типами данных. Она просто копирует указанное количество байтов из исходного буфера в целевой.memmove может обрабатывать перекрывающиеся буферы. В отличие от memcpy, которая просто копирует данные из одного места в другое, memmove может безопасно перемещать данные, даже если исходный и целевой буферы перекрываются.
Функция memmove может быть полезна для удаления элементов из массива. Например, если вы хотите удалить элемент из массива и сдвинуть оставшиеся элементы влево, вы можете использовать memmove для перемещения данных в массиве.
Подробно рассказываем о высокопроизводительных решениях с фреймворком userver на новом бесплатном вебинаре!
Он предназначен для создания надежных и молниеносных микросервисов и веб-серверов. Освойте передовой C++ фреймворк всего за 90 минут!
✅ Вы узнаете:
- Уникальные архитектурные особенности и преимущества userver, которые сделают вашу работу легче и эффективнее.
- Как быстро настроить окружение и запустить свой первый проект, не тратя лишнего времени.
- Советы высококлассных профессионалов по работе с асинхронностью, которые помогут вам стать мастером своего дела и очень много другой полезной сочной информации!
💡 Будет особенно интересно:
- C++ разработчикам, стремящимся освоить мощный инструмент для создания микросервисов.
- Backend-инженерам и Team Lead'ам, ищущим высокопроизводительные решения для своих задач.
- Специалистам, работающим над масштабируемыми системами.
❌❌Получите практический и ценный опыт работы с userver, который можно сразу применить в своих проектах - регистрируйтесь по ссылке: https://otus.pw/Ez3k/
P.S. Все зарегистрированные участники получат приличную скидку на обновленный топовый курс «C++ Developer. Professional»Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Курс «Реверсивный инжиниринг ПО под ОС Windows» стартует 16 декабря!
В курсе подробно рассматривается синтаксис Ассемблера, анализ приложений различного уровня сложности, от простейших crackme до полноценных программ на современных архитектурах.
Необходимые знания: язык Ассемблера, С/С++, python, навыки работы с IDA и другими инструментами для реверса
Вы получите сертификат/удостоверение о повышении квалификации
@Codeby_Academy
Узнать подробнее о курсе
Создание TCP-сервера на C++
Это введение в сетевое программирование путем создания сервера, который возвращает сообщения клиента.
Смотреть видео
Как написать свой микросервис?
Создавать все с нуля, воспользоваться практикой опытных коллег или позаимствовать готовые элементы из других проектов — вариантов много. Предлагаем использовать userver — асинхронный фреймворк от Техплатформы Екома и Райдтеха Яндекса для быстрого создания микросервисов и высоконагруженных приложений на C++.
- Входит в топ 15 фреймворков по версии TechEmpower
- Обладает самым богатым функционалом среди производительных фреймворков: есть асинхронные драйверы для баз данных и протоколов передачи данных, высокоуровневые компоненты для кэшей, распределенной блокировки, трассировки, метрик и многое другое
- Протестирован на масштабах Яндекса
Узнайте больше о нем и других фреймворках от разработчиков Екома и Райдтеха Яндекса на dev.go.yandex
Алгоритм lexicographic_compare
Совершает лексикографическое сравнение 2 диапазонов
Лексикографическое сравнение - это операция со следующими свойствами:
1)Два диапазона сравниваются поэлементно.
2)Первый элемент несовпадения определяет, какой диапазон лексикографически меньше или больше другого.
3)Если один диапазон является префиксом другого, более короткий диапазон лексикографически меньше другого.
4)Если два диапазона имеют эквивалентные элементы и имеют одинаковую длину, тогда диапазоны лексикографически равны.
5)Пустой диапазон лексикографически меньше любого непустого диапазона.
6)Два пустых диапазона лексикографически равны.
История одного перехода с GCC на Clang.
https://habr.com/ru/company/timeweb/blog/682324/
Функция strrchr()
В C++ strrchr() - это предопределенная функция, используемая для обработки строк. Эта функция возвращает указатель на всю строку после последнего появления заданного символа. Символ, последнее вхождение которого мы хотим найти, передается в качестве второго аргумента функции, а строка, в которой мы должны найти этот символ, передается в качестве первого аргумента функции.
В примере кода на картинке мы используем функцию для того, чтобы найти порядковый номер символа в заданной строке.
Алгоритмы all_of, any_of и none_of
Начиная с C ++ 11, в STL C ++ добавляются некоторые новые интересные алгоритмы. Эти алгоритмы работают с массивом и полезны для экономии времени во время кодирования и, следовательно, также полезны в конкурентном программировании.
Корутины в UnrealEngine
В этой статье автор рассказывает, как можно улучшить читаемость асинхронного кода и сократить немалое количество писанины.
Смотреть статью
Взаимодействие между процессами на С++ и PHP. Сокеты, семафоры и разделяемая память
Есть некоторый сервис, написанный на C++, работающий в виде демона. Требуется к этому сервису отправлять запросы из web-приложения, реализованного на PHP. Сами по себе запросы и ответы достаточно короткие (порядка килобайта в среднем размер запроса и порядка сотен байт размер ответа).
Смотреть статью
Алгоритм set_intersection
Создает отсортированную последовательность из элементов, встречающихся в обеих последовательностях – [first1, last1) и [first2, last2).