seniorcpp | Unsorted

Telegram-канал seniorcpp - Senior C++ Developer

13626

Изучаем C++. По вопросам сотрудничества: @adv_and_pr

Subscribe to a channel

Senior C++ Developer

Pure virtual function

Pure virtual function (чисто виртуальная функция) — это виртуальная функция, для которой мы можем иметь реализацию, но мы должны переопределить эту функцию в производном классе, иначе производный класс также станет абстрактным классом.
Чисто виртуальная функция объявляется путем присваивания в объявлении.

В этом примере у нас есть абстрактный базовый класс Shape, который содержит чисто виртуальную функцию draw(). Мы не можем создать объект класса Shape, так как он является абстрактным классом.
Затем мы создаем два производных класса Circle и Rectangle, которые переопределяют функцию draw().
В функции main() мы создаем объекты circle и rectangle, а также указатель на базовый класс Shape. Мы устанавливаем указатель на объекты circle и rectangle и вызываем функцию draw() для каждого из них.

Читать полностью…

Senior C++ Developer

Const correctness

Const correctness — это концепция, которая позволяет явно указывать, может ли функция-член класса изменять объект или нет.

Когда функция-член класса объявлена с ключевым словом const, это означает, что она не может изменять состояние объекта. Если попытаться изменить объект внутри такой функции, компилятор выдаст ошибку.

В этом примере функция age() объявлена как const, что означает, что она не может изменять объект Person. Функция set_age() не объявлена как const, поэтому она может изменять объект.

Читать полностью…

Senior C++ Developer

🫵 Пройди тест по C++ и проверь свои знания.

Ответишь
— пройдешь на продвинутый курс "C++ Developer. Professional" от OTUS по специальной цене + получишь запись мастер-класса от преподавателя курса.

👉 ПРОЙТИ ТЕСТ: https://otus.pw/pLpV/

Нативная интеграция. Информация о продукте www.otus.ru

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Какие есть особенности статических полей класса в языке С++?

Статические поля класса в C++ имеют несколько особенностей:

1. Общий доступ: Статические поля являются общими для всех объектов этого класса. Это означает, что изменение значения статического поля в одном объекте, изменяет его для всех объектов этого класса.
2. Инициализация: Статические поля инициализируются только один раз, когда программа запускается. Значения статических полей сохраняются на протяжении всего времени работы программы.
3. Доступ: Доступ к статическим полям класса возможен без создания объекта этого класса, например, используя имя класса и оператор :: .
4. Память: Статические поля класса хранятся не в куче или стеке, а в статической области памяти, что позволяет им занимать память только один раз, независимо от количества созданных объектов класса.

Читать полностью…

Senior C++ Developer

override

override — это ключевое слово, которое используется для указания на то, что функция в производном классе предназначена для переопределения функции с тем же именем в базовом классе.


Это позволяет достичь полиморфизма на этапе выполнения и предоставить специфическую реализацию функции, которая уже предоставлена в базовом классе.

Читать полностью…

Senior C++ Developer

Нашли рейтинг лучших курсов по C++ разработке!

Tutortop
— образовательный маркетплейс №1, где представлено свыше 5000 курсов от более чем 300 школ и все их можно сравнить по рейтингу, цене и отзывам, а еще купить дешевле, чем напрямую 🔥


Собрали подборку из топовых курсов для разработчиков на C++ по мнению их пользователей:

Курс «Разработчик на C++» от Нетологии. Рейтинг 4.8 из 5.

Курс «Разработка игр в Unreal Engine на C++» от Gamedev онлайн-школы XYZ School. Рейтинг 4.7 из 5.

Курс «Быстрый старт в IT» от ProductStar. Рейтинг 4.8 из 5.


Скидку до 10 000 ₽ к финальной цене на эти и десятки других курсов по разработке можно получить на маркетплейсе tutortop!⚡️

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое выравнивание данных?

Выравнивание данных (data alignment) — это процесс выравнивания слов памяти в компьютерной системе таким образом, чтобы каждый адрес начала слова был кратен адресу выравнивания для этого слова.
Это делается для увеличения производительности, так как доступ к памяти, выровненной по границе слова, выполняется быстрее, чем к памяти с не выровненным доступом.

Большинство компиляторов C++ пытаются генерировать код, который соответствует некоторым правилам выравнивания памяти на конкретном аппаратном обеспечении.

Читать полностью…

Senior C++ Developer

anonymous namespaces

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

В этом примере переменная hidden_variable и функция hidden_function находятся в анонимном пространстве имен. Они будут видимы только в текущем файле исходного кода и не будут доступны из других файлов. Это аналогично объявлению их с static в глобальной области видимости, но анонимные пространства имен являются более современным и предпочтительным подходом.

Использование анонимных пространств имен помогает организовать код, уменьшить вероятность конфликтов имен и улучшить инкапсуляцию.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
В чем разница между git fetch и git pull?

Разница между этими командами заключается в том, что когда вы используете команду git fetch, Git извлекает последние изменения из удаленного репозитория в ваш локальный репозиторий, но оставляет эти изменения в отдельной ветке git origin.

А команда git pull извлекает и интегрирует (скачивает и сливает) последние изменения из удаленного репозитория в вашу текущую ветку работы.

Читать полностью…

Senior C++ Developer

Просмотр все файлов в папке с помощью C++

Для того, чтобы просмотреть все файлы в папке с помощью C++, можно использовать функцию std::filesystem::directory_iterator(). Данная функция позволяет перебирать все файлы в указанной директории.

В данном примере мы получаем текущую директорию с помощью функции fs::current_path(), а затем проходим по всем файлам в этой директории с помощью цикла for. Внутри цикла мы выводим путь к каждому файлу с помощью метода entry.path().

Читать полностью…

Senior C++ Developer

std::unordered_multimap

std::unordered_multimap - это структура данных, которая представляет собой неупорядоченную хэш-таблицу, содержащую пары ключ-значение.
Она подобна std::unordered_map, но может содержать несколько элементов с одинаковым ключом.

Для использования нужно включить заголовочный файл <unordered_map> и указать типы ключа и значения, например:
std::unordered_multimap<std::string, int> myMap

В примере последний insert добавляет элемент с ключом "third", но так как элемент с таким ключом уже есть, то он будет добавлен в то же место (то есть этот ключ будет иметь два значения - 3 и 4).

Чтобы получить значение элемента по ключу, можно воспользоваться методом find — в примере он найдет элементы с ключом "third" и выведет их значения (3 и 4).

Читать полностью…

Senior C++ Developer

vtable (virtual function table)

vtable — это механизм динамического связывания для языка программирования C++ и его объектно-ориентированного подхода
. vtable содержит адреса виртуальных функций, определенных в базовом классе, которые используются для вызова соответствующих функций в производных классах, когда объект передается как указатель или ссылка на базовый класс.

С помощью vtable C++ позволяет создавать более эффективные и гибкие программы, предоставляя возможность для динамической диспетчеризации функций, основанной на типе объекта, переданного в качестве параметра.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
На сколько потоков лучше разбить задачу? От чего это зависит?

Задачу лучше разбить на потоки таким образом, чтобы максимально эффективно использовать ресурсы процессора.
Количество потоков зависит от общей нагрузки на систему, количества доступных ядер процессора и оптимизации потоков, чтобы избежать блокировки или гонки за ресурсы.

В целом, количество потоков должно быть достаточным для обработки задачи в максимально короткие сроки, но не должно превышать количество доступных ядер процессора. При выборе количества потоков нужно учитывать также характеристики задачи, например, объем данных, степень их зависимости и работу с разделяемыми ресурсами.

Читать полностью…

Senior C++ Developer

⚡️ Стартовал прием заявок на Технологический конкурс НТИ Up Great «Экстренный поиск»!

Участникам предстоит преодолеть комплексный технологический барьер, предусматривающий разработку технологий и технических решений, объединенных в единую систему, позволяющую эффективно использовать техническое зрение при поиске пропавших людей с применением беспилотных воздушных судов (БВС).

На первом этапе (Сателлит №1) участникам необходимо разработать программное решение для поиска объектов (людей) на изображениях, полученных с БВС. 

Призовой фонд Сателлита №1 составляет 5 млн руб. 
Лучшим командам, удовлетворяющим требованиям технического регламента, организаторами будут предоставлены БВС для участия во втором этапе (Сателлит №2) и финале конкурса.

Призерами и победителями могут стать только налоговые резиденты РФ.

📲 Заявки на Сателлит № 1 принимаются до 12 июня 2023 г. по ссылке.

Конкурс организуется совместно МФТИ, Фондом НТИ и добровольческим поисково-спасательным отрядом «ЛизаАлерт». Общий призовой фонд составляет 135 млн руб.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое Undefined behavior?

Undefined behavior - это непредсказуемое поведение программы
, которое происходит, когда в коде содержится операция, которая не определена стандартом языка.

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

Ошибки в таком коде могут проявляться разнообразными способами, включая прекращение работы программы, непредсказуемые выходные данные, повреждение памяти или даже повреждение операционной системы. Избегайте Undefined behavior в своем коде, чтобы обеспечить надежность и безопасность системы.

Читать полностью…

Senior C++ Developer

Ленивые вычисления в С++

lazy evaluation — это стратегия вычислений, при которой вычисления откладываются до тех пор, пока результат не станет действительно необходимым. Это позволяет оптимизировать производительность и ресурсоемкость программы, избегая ненужных вычислений.

Ленивые вычисления могут быть реализованы с использованием различных подходов, таких как отложенное вычисление (deferred evaluation), вычисление по требованию (on-demand evaluation) и мемоизация (memoization).

В этом примере вычисления выполняются только при первом обращении к числу Фибоначчи с определенным индексом, после чего результат сохраняется в контейнере memo для последующего использования. Это позволяет избежать повторных вычислений и оптимизировать производительность программы.

Читать полностью…

Senior C++ Developer

const_cast

const_cast — это оператор приведения типов в C++, который используется для изменения квалификаторов const или volatile у указателей или ссылок. Он позволяет временно убрать const или volatile квалификаторы, чтобы изменить значение переменной или вызвать неконстантный метод для константного объекта.

В этом примере у нас есть класс MyClass с двумя методами: nonConstMethod() и constMethod(). Метод nonConstMethod() не является константным, поэтому его нельзя вызвать на константном объекте.

Однако, внутри constMethod() мы используем const_cast для временного изменения квалификатора const у указателя this, что позволяет нам вызвать nonConstMethod() на константном объекте.

Читать полностью…

Senior C++ Developer

Вложенные пространства имен (nested namespaces)

Как можно понять из названия, вложенное пространство имен определяется внутри другого пространства имен. Они используются для организации кода, разделения его на логические блоки и предотвращения конфликтов имен.

nested namespaces часто используются в больших проектах, при создании библиотек, а также для версионирования.

Читать полностью…

Senior C++ Developer

Перегрузка функций (overload)

Это возможность определить несколько функций с одним и тем же именем, но с разными параметрами.
Компилятор выбирает подходящую функцию на основе количества и типов аргументов, переданных при вызове функции.

Это позволяет использовать одно и то же имя функции для выполнения различных задач, упрощая код и делая его более читаемым.

В этом примере мы определили две перегруженные функции add(). Одна из них принимает два целых числа и возвращает их сумму, а другая принимает два числа с плавающей точкой и возвращает их сумму. В функции main() мы вызываем обе функции add() с разными типами аргументов.

Читать полностью…

Senior C++ Developer

mutable

Ключевое слово mutable полезно, когда вам нужно изменять состояние объекта в константном контексте, например, для кеширования результатов или реализации ленивых вычислений.
Однако, следует использовать его с осторожностью, чтобы не нарушать принципы инкапсуляции и сокрытия информации.

В этом примере у нас есть класс Counter с двумя членами: count и mutableCount. Метод increment объявлен как константный — он не должен изменять состояние объекта. Однако, поскольку mutableCount объявлен с ключевым словом mutable, мы можем изменять его значение внутри константного метода increment.

В функции main мы создаем константный объект counter и вызываем метод increment три раза. Значение count остается неизменным, так как его нельзя изменить в константном методе, в то время как значение mutableCount увеличивается на 1 с каждым вызовом метода increment.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Для чего можно использовать private наследование?

Приватное наследование позволяет производному классу наследовать реализацию базового класса, но делает все его члены (как публичные, так и защищенные) приватными для производного класса.

Приватное наследование может быть полезным в следующих ситуациях:
-
Когда мы хотим повторно использовать реализацию базового класса, но не хотим раскрывать его интерфейс для пользователей производного класса.
- Когда мы хотим изменить поведение базового класса, не нарушая инкапсуляцию и сокрытие информации.
- Когда мы хотим использовать базовый класс для управления ресурсами или предоставления служебных функций, которые должны быть скрыты от пользователей производного класса.

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

Читать полностью…

Senior C++ Developer

std::atomic_flag::wait

std::atomic_flag::wait - это метод класса std::atomic_flag, который блокирует выполнение потока, пока атомарный флаг не будет равен заданному значению.

В этом примере есть два потока - t1 и t2, каждый из которых ждет, пока атомарный флаг flag не будет очищен. Когда flag очищается, соответствующий поток переходит в режим выполнения, выводя сообщение "Thread executing".

Результатом работы данной программы является вывод сообщений "Thread waiting" до изменения flag на false и сообщений "Thread executing" после его изменения.

Читать полностью…

Senior C++ Developer

Семантика перемещения

Семантика перемещения - это концепция, введенная в C++11, которая позволяет компилятору оптимизировать копирование объектов, когда исходный объект не будет использоваться дальше.
Это достигается с помощью специальных конструкторов и операторов присваивания, называемых перемещающими конструкторами и перемещающими операторами присваивания.

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

В этом примере мы создаем два вектора строк vec1 и vec2. Затем мы используем функцию std::move для передачи содержимого vec1 в vec2 с использованием семантики перемещения. В результате, vec1 становится пустым, а vec2 получает данные, которые раньше были в vec1.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Как определить, что в программе есть memory leak?

В программе на C++ можно определить наличие memory leak с помощью использования инструментов для анализа памяти, таких как Valgrind или AddressSanitizer. Другим возможным способом является использование кода, который автоматически отслеживает выделение и освобождение памяти. Можно также использовать дебаггер или профилирование, чтобы выявить проблемы с памятью.

Важно понимать, что memory leak может привести к утечке ресурсов и ухудшению производительности приложения, поэтому необходимо тщательно мониторить использование памяти и обнаруживать любые проблемы сразу.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое deadlock?

Deadlock - это ситуация, когда два или более процесса блокируют друг друга, ожидая освобождения ресурсов, которые удерживают другие процессы.
При deadlock нет возможности продолжить работу ни одному из этих процессов без вмешательства со стороны системы или приложения.

Эта проблема может возникнуть при работе с разделяемыми ресурсами, такими как потоки, файлы, сетевые соединения и т. д., и ее решение требует особого внимания и организации кода.

Читать полностью…

Senior C++ Developer

vptr (Virtual Pointer)

vptr — это указатель на виртуальную таблицу, которая содержит информацию о виртуальных функциях класса.
vptr используется при вызове виртуальных функций, а также при операции приведения типов с помощью dynamic_cast.

В этом примере мы создали два класса: Base и Derived. Класс Derived наследуется от класса Base и переопределяет его виртуальную функцию func(). Затем мы создали объект класса Derived и присвоили его адрес указателю на базовый класс Base.

Затем вызываем функцию func() с помощью указателя на базовый класс. Здесь vptr смотрит на таблицу виртуальных функций, чтобы определить, какую функцию вызывать.

Результатом будет вывод "Derived", так как мы переопределили функцию в классе Derived.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое stack overflow?

Переполнение стэка (stack overflow) – это ошибка, которая возникает, когда программа сохраняет больше данных на стеке, чем зарезервировано памяти. В результате переполнения стэка может произойти остановка программы или аварийное завершение работы.

Это часто происходит в малых приложениях с ограниченным количеством памяти. Для предотвращения такого рода ошибок следует бережно рассчитывать размер стека при проектировании и написании кода программы.

Читать полностью…

Senior C++ Developer

Алгоритм gcd

Используется для нахождения НОД двух чисел. Он принимает два значения одного типа данных в качестве аргументов и возвращает их НОД.

Временная сложность: O(log(max(value1, value2)))).

Читать полностью…

Senior C++ Developer

std::make_shared

std::make_shared - это стандартная функция, используемая для создания объектов типа std::shared_ptr.
Она позволяет создавать объекты типа std::shared_ptr без использования оператора new. Это сокращает код и упрощает его читаемость.

В этом примере мы создаем класс MyClass, имеющий поле value и метод Print(), выводящий значение поля value на консоль. Затем мы используем std::make_shared для создания объекта типа std::shared_ptr:

std::make_shared<MyClass>(42);

*Обратите внимание, что таким способом созданный объект MyClass будет автоматически удален, когда на него не останется ссылок, даже если в вашем коде не указано delete.

Читать полностью…

Senior C++ Developer

Яндекс Практикум запустил бесплатный курс “Основы работы с Git”. Вы сможете полностью освоить популярную систему контроля версий кода за 20 часов.

Курс будет полезен тем, кто только погружается в разработку, и тем, кто не первый год пишет код:
— новички освоят инструменты, которые точно пригодятся в профессии;
— знатоки структурируют знания и повысят свою продуктивность.

На курсе вы научитесь:
— Писать код вместе с другими разработчиками и разработчицами;
— Отменять и откладывать изменения в своих ветках;
— Использовать локальный и удалённый репозиторий;
— Соединять ветки и разрешать конфликты;
— Управлять репозиторием через IDE и консоль;
— Понимать принципы и культуру командной разработки.

И освоите необходимые инструменты и технологии:
— GitHub;
— Terminal;
— GitHub Desktop;
— Bitbucket;
— GitBash;
— GitLab.

Переходите по ссылке и начинайте заниматься уже сейчас.

Реклама АНО ДПО "Образовательные технологии Яндекса», ИНН:7704282033, erid: LjN8KCT9Y

Читать полностью…
Subscribe to a channel