C++ Academy
16K subscribers
590 photos
125 videos
1 file
555 links
По всем вопросам- @haarrp

@itchannels_telegram - 🔥 best it channels

РКН: clck.ru/3FmxJF
Download Telegram
🦾 Задача с подвохом: Виртуальные функции и конструкторы

Условие:

Что выведет следующий код и почему?


#include <iostream>

class Base {
public:
Base() {
std::cout << "Base constructor\n";
foo();
}
virtual void foo() {
std::cout << "Base foo\n";
}
};

class Derived : public Base {
public:
Derived() {
std::cout << "Derived constructor\n";
}
void foo() override {
std::cout << "Derived foo\n";
}
};

int main() {
Derived d;
return 0;
}


Вопрос:
Что будет выведено? Почему результат может удивить даже опытных C++ разработчиков?

🔍 Разбор:

1️⃣ Мы создаём объект
Derived d;.
Это вызывает конструктор
Derived, но сначала выполняется конструктор `Base` (по правилам иерархии).

2️⃣ В конструкторе
Base есть вызов foo();.
Может показаться, что поскольку объект на самом деле
Derived, вызовется Derived::foo().

Но! Вот главный подвох:

➡️ В C++, когда вы вызываете виртуальную функцию из конструктора (или деструктора), она не виртуальна для объекта, который ещё не полностью сконструирован.

На момент вызова
foo() объект всё ещё только Base, потому что Derived ещё не инициализирован.

Пошаговое выполнение:

- Вызов конструктора
Base:
```
Base constructor
```
- Вызов
foo() внутри конструктора Base:
Это вызовет Base::foo(), а не
Derived::foo():
```
Base foo
```
- После завершения конструктора
Base, вызывается конструктор Derived:
```
Derived constructor
```

Итоговый вывод:

```
Base constructor
Base foo
Derived constructor
```

💥 Подвох:

• Многие ожидают, что виртуальные функции работают «магически» всегда.
• Но при вызове из конструктора (или деструктора) виртуальные функции не полиморфны, потому что объект ещё не «стал» Derived полностью.

🛡️ Что нужно помнить:

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

Вывод:

C++ строго следует правилам объектной модели: пока объект конструируется (или разрушается), он считается экземпляром того класса, конструктор которого выполняется в данный момент. Это поведение важно помнить при проектировании иерархий классов!


@cpluspluc
💥 CLion теперь бесплатен для некоммерческих проектов! 😮

CLion — мощная IDE для разработки на C и C++, стала доступна бесплатно для:

• студентов и всех, кто изучает программирование
• разработчиков open source-проектов
• создателей обучающего и технического контента

Отличная возможность работать в профессиональной среде без затрат 💻

👉 Официальная шпаргалка по горячим клавишам для CLion: https://resources.jetbrains.com/storage/products/clion/docs/CLion_reference_card_all.pdf


@cpluspluc
🍊 JUCE — фреймворк для создания аудиоприложений на C++. Этот инструмент — must-have для разработчиков аудиоплагинов и музыкальных приложений. Проект предоставляет готовые компоненты для работы с аудио, MIDI и GUI, которые работают на всех платформах, от macOS до Android.

Фреймворк также имеет интеграцию с CMake: можно собрать проект одной командой, а встроенный генератор создаст настройки для Xcode, Visual Studio и Android Studio. Под капотом поддержка современных стандартов вроде C++17 и ARM-архитектур.

🤖 GitHub

@cpluspluc
🎮 UEVR — универсальный мод для погружения игр Unreal Engine в VR. С помощью UEVR можно превратить практически любой проект на Unreal Engine 4-5 в полноценный VR-эксперимент с поддержкой 6DOF, стереоскопическим 3D и даже эмуляцией motion-контроллеров.

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

🤖 GitHub

@cpluspluc
📚 Librum — читалка с облачной библиотекой и 70 000+ бесплатных книг

С этим инструментом ваша библиотека станет по-настоящему мобильной — проект имеет синхронизацию между устройствами, теги, коллекции и даже статистика чтения — всё под рукой, будь то Windows, Linux или macOS.

Проект полностью открытый, а его команда живёт на донаты. При этом здесь уже есть поддержка редких форматов вроде CBZ (для комиксов) и TIFF, а в дорожной карте — TTS и AI-инструменты для заметок.

🤖 GitHub

@cpluspluc
Backend Talks от Яндекс 360

Смотрите записи докладов с митапа от Яндекс 360 для бэкенд-разработчиков, архитекторов и DevOps-инженеров.

На пути к 9999: Игорь Обручев, руководитель группы SRE, рассказал, какими принципами команда руководствуется при создании сервисов, как без паники чинят инциденты и как в этом помогают учения.

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

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

Больше материалов о технологиях в Яндекс 360
@yandex360team
⚡️ Kubernetes устраняет проблему безопасности с приватными образами, которую не решали более 10 лет

Ранее, при использовании политики imagePullPolicy: IfNotPresent, kubelet мог запускать контейнеры из приватных образов, даже если pod не передавал нужные imagePullSecrets. Это означало, что уже загруженные образы могли использоваться без повторной проверки прав доступа.

Начиная с Kubernetes v1.33, kubelet теперь проверяет учетные данные pod-а даже для локально кэшированных образов. Если образ найден на узле, kubelet удостоверяется, что pod имеет соответствующие pull credentials, прежде чем разрешить его запуск.

Ожидается, что в v1.34 эта функция перейдёт в бета-стадию и получит дополнительные улучшения.

https://kubernetes.io/blog/2025/05/12/kubernetes-v1-33-ensure-secret-pulled-images-alpha/
🧵 Пишем свой сетевой стек с нуля: Ethernet и ARP на C

Хочешь разобраться, как работает TCP/IP на самом низком уровне?
В этой статье показано, как реализовать Ethernet и ARP в пользовательском пространстве Linux — на чистом C.

🔌 Что используется:
- TAP-устройство для приёма и отправки "сырых" Ethernet-кадров
- Структуры с __attribute__((packed)) для точного соответствия форматам
- Чтение и парсинг ARP-пакетов вручную

📦 Что реализуется:
- Создание ARP-запросов и обработка ответов
- Простейший ARP-кэш
- Парсинг и генерация Ethernet-фреймов
- Весь ввод-вывод — в user space

🧠 Зачем это нужно?
- Понимание, как работают сетевые интерфейсы на уровне байтов
- Практика системного программирования на C
- Основа для написания своего сетевого стека: IPv4, ICMP, UDP, TCP

📚 Статья:
https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/

💻 Исходники на GitHub:
https://github.com/saminiir/level-ip

#Linux #Networking #C #TCPIP #ARP #Ethernet #DevLowLevel #СистемноеПрограммирование
🧪 Jank — диалект Clojure, который вместо JVM использует LLVM и предлагает бесшовную интероперабельность с C++. Разработчики обещают сохранить всю прелесть Clojure: иммутабельные структуры данных, функциональный подход и REPL, но с перспективой нативной производительности.

Пока проект находится в активной разработке, но уже поддерживает базовый синтаксис Clojure и часть core-функций. Для фанатов Clojure, которые мечтают избавиться от JVM-оверхедов, jank может стать интересной альтернативой.

🤖 GitHub

@cpluspluc
🧠 Задача с подвохом для продвинутых C++ разработчиков

🔹 Уровень: Advanced
🔹 Темы: std::vector, управление памятью, конструкторы/деструкторы, reserve() vs resize()

📌 Условие

Рассмотрим следующий код:


#include <iostream>
#include <vector>

struct Foo {
Foo() { std::cout << "Ctor\n"; }
~Foo() { std::cout << "Dtor\n"; }
Foo(const Foo&) { std::cout << "Copy\n"; }
Foo(Foo&&) noexcept { std::cout << "Move\n"; }
};

int main() {
std::vector<Foo> v;
v.reserve(3); // Резервируем место под 3 элемента

std::cout << "--- Pushing ---\n";
for (int i = 0; i < 3; ++i) {
v.push_back(Foo());
}

std::cout << "--- Done ---\n";
}


Вопросы

1. Что будет выведено на экран?
2. Почему reserve() не предотвращает конструкторы копирования/перемещения?
3. Что изменится, если заменить reserve(3) на resize(3)?

🔍 Разбор

Ожидаемый вывод:

--- Pushing ---
Ctor
Move
Dtor
Ctor
Move
Dtor
Ctor
Move
Dtor
--- Done ---
Dtor
Dtor
Dtor


🔧 Почему так происходит

- Foo() создаёт временный объект.
- push_back() вызывает перемещающий конструктор Move.
- Временный объект уничтожается (вызывается `Dtor`).
- reserve(3) выделяет память, но не создаёт объектов.

🔄 Если заменить `reserve(3)` на `resize(3)`

- resize(3) создаст 3 объекта Foo через конструктор по умолчанию.
- push_back(Foo()) добавит четвёртый, возможно вызовет realocation.
- Это может привести к копированию или перемещению уже созданных элементов.

⚠️ Подвох

Многие ошибочно считают, что reserve(n) создаёт n объектов. Но это не такreserve() только выделяет память, не вызывая конструкторы. Именно поэтому внутри push_back всё равно происходит перемещение или копирование.

🧠 Вывод

- reserve() — экономия на реаллокациях, без создания объектов.
- resize() — создаёт n объектов, вызывает конструкторы.
- Не путай эти методы — от этого зависит и производительность, и семантика.


// Резервирует память, не создаёт объекты
v.reserve(10);

// Создаёт 10 объектов Foo
v.resize(10);


📌 Совет:
Если не хочешь лишнего перемещения, используй emplace_back():


v.emplace_back(); // Вызывает конструктор Foo напрямую внутри вектора



@cpluspluc
⚡️Готовы повысить квалификацию и стать востребованным профи в C++?

Курс «C++ Developer. Professional» — идеальный выбор для разработчиков, которые уже знакомы с языком и хотят выйти на новый уровень. Вы освоите принципы многопоточного программирования, работу с новыми стандартами C++ 20 и 23, а также научитесь эффективно взаимодействовать с сетью и обрабатывать большие объемы данных. Интересные кейсы и 14 практических работ помогут закрепить знания и подготовиться к реальным задачам.

С обучением от OTUS вы получите глубокое понимание C++, научитесь проектировать масштабируемые решения и писать чистый, эффективный код. После завершения курса у вас будет прочная база для роста и карьерного продвижения в крупнейших IT-компаниях.

👉Пройдите вступительное тестирование и получите скидку на обучение:https://otus.pw/jJ4O/?erid=2W5zFHRfeBS

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🧠 Хитрая задача на C++: "Исчезающее число среди строк"

Условие
Дан список строк, представляющих числа от 1 до 100 включительно. Одного числа нет.
Твоя задача — найти, какого именно числа не хватает.
Нельзя использовать сортировку, std::accumulate, std::unordered_map, std::stoi можно.

Пример:
Массив: ["1", "2", "3", ..., "98", "99"] (без "100")
Ответ: 100

Формат:


int findMissingNumber(const std::vector<std::string>& data);


Решение с XOR


#include <iostream>
#include <vector>
#include <string>

int findMissingNumber(const std::vector<std::string>& data) {
int xor_full = 0;
int xor_data = 0;

for (int i = 1; i <= 100; ++i) {
xor_full ^= i;
}

for (const auto& s : data) {
xor_data ^= std::stoi(s);
}

return xor_full ^ xor_data;
}


Пример использования:


int main() {
std::vector<std::string> data;
for (int i = 1; i <= 100; ++i) {
if (i != 57) { // Удалим 57
data.push_back(std::to_string(i));
}
}

std::cout << "Пропущено: " << findMissingNumber(data) << std::endl;
return 0;
}


Почему работает:
XOR — идеальное решение, когда нужно найти одну потерянную величину среди уникальных значений.
a ^ a = 0, 0 ^ b = b. Поэтому:
(XOR всех от 1 до 100) ^ (XOR из данных) = отсутствующее число.

@cpluspluc
Наша команда Mobile SDK сделала решение, которое позволяет из Flutter-приложения напрямую вызывать C++ код. Под капотом:  

➡️ FFI для прямого взаимодействия с C++ кодом ядром; 
➡️ Кодогенерируемое API почти полностью аналогично iOS и Android Mobile SDK; 
➡️ TextureWidget вместо PlatformView для рендеринга карты; 
➡️ Единые виджеты для отображения карты как для Android, так и для iOS.

Если тебе нравится разбираться в архитектуре SDK — заглядывай читать. Детально рассказываем про основу продукта — кодогенератор для генерации платформенного Dart-кода на основе C++ интерфейсов.
🧪 Vaev — легковесный HTML/CSS-движок на C++

Проект [Vaev](https://github.com/skift-org/vaev) от skift-org — это минималистичный, быстрый и безопасный движок рендеринга HTML/CSS, написанный на современном C++.

🔧 Что умеет:
- Рендерит HTML и XHTML (работает даже с google.com — *почти полностью*)
- Поддерживает каскадные стили, calc(), var(), @page и вывод в PDF
- Работает с file:// и HTTP-запросами (без HTTPS и JS)
- Идеален для генерации документов вместо wkhtmltopdf

🧑‍💻 Для кого:
- Для разработчиков, которым интересно, как устроен браузер
- Для тех, кто хочет встроить простой и быстрый движок CSS-рендеринга в своё ПО
- Для интеграции в системы типа Odoo и скриптов по генерации печатных версий сайтов

📦 Пример запуска:

pip install git+https://github.com/cute-engineering/cutekit
python -m ck run --release vaev-browser -- yourfile.html


🧠 Почему это интересно:
- Написан на современном, чистом C++ — легко читать и дорабатывать
- Можно собрать как часть skiftOS или использовать отдельно
- Перспективы развития: в будущем — полноценный движок с JS

🔗 GitHub: https://github.com/skift-org/vaev

@cpluspluc
🐧 Новый бэкдор Auto-Color атакует Linux: как он работает и почему это опасно

Исследователи из Unit 42 (Palo Alto Networks) сообщили об обнаружении нового Linux-бэкдора под названием Auto-Color, отличающегося продвинутыми методами сокрытия и устойчивостью в системе. Он нацелен на серверные инфраструктуры и контейнерные среды.

🛠 Что известно о Auto-Color:

• написан на C/C++, может работать в большинстве современных Linux-дистрибутивов
• использует спуфинг процесса — маскируется под безобидные системные процессы (`kworker`, `cron`)
• поддерживает удалённое выполнение команд и может скачивать/исполнять произвольные бинарники
• при старте внедряется в системные скрипты автозапуска (`~/.bashrc`, rc.local, `systemd`)
• содержит self-delete механизм, чтобы удалить себя после выполнения задачи
• применяет встроенное шифрование конфигурации и команд управления (C2)

🔒 Вектор заражения:

• Auto-Color попадает в систему через:
- вредоносные скрипты в контейнерных образах
- эксплойты для уязвимых веб-приложений
- бэкдоры в CI/CD пайплайнах

💡 Интересные особенности:

• использует нестандартные порты и нестандартные протоколы поверх TCP/UDP
• шифрует коммуникации с C2-сервером с помощью RC4/ChaCha
• хранит свои конфигурации в скрытых файлах dotfiles или шифрованных секциях бинарника

📉 Почему это важно:

• многие системы мониторинга пропускают его из-за обфускации
• он способен действовать неделями незаметно
• наличие встроенной логики persistence делает его опасным в DevOps-среде

🔍 Что делать:

1. Анализировать подозрительные процессы, даже если они выглядят как kworker
2. Проверить наличие изменений в .bashrc, .profile, cron'ах и unit-файлах systemd
3. Изолировать подозрительные контейнеры и проверить их содержимое на вредоносные бинарники
4. Использовать инструменты типа rkhunter, chkrootkit, Falco, AuditD

🧠 Вывод:

Auto-Color — пример того, насколько сложно может быть обнаружение современных Linux-бэкдоров. Его появление — ещё одно напоминание о необходимости непрерывного мониторинга, Zero Trust подхода и анализе поведения процессов, а не только сигнатур.

📌 Оригинальный анализ

@cpluspluc
Хотите освоить C++ с нуля и стать востребованным разработчиком? 

Пройдите курс от OTUS и получите знания, которые откроют перед вами новые карьерные горизонты!

⚡️ Этот курс идеально подходит для начинающих и тех, кто хочет углубить свои знания. С нуля до уровня Middle Developer — вы освоите создание собственных типов данных, работу с многопоточностью и современными стандартами C++. Изучите лучшие практики проектирования, работу с памятью и сетью, а также освоите принцип работы с базами данных и CI/CD.

🔥 На обучении вы разработаете 2 реальных проекта для портфолио, а диплом OTUS поможет вам уверенно проходить собеседования в крупнейших компаниях. Станьте частью индустрии с актуальными знаниями!

👉 Оставьте заявку: https://tglink.io/dab3db2405d6?erid=2W5zFHRZw52

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🔍 C++ Задача для профи: кто вызовется?

У тебя есть следующий код:


#include <iostream>
#include <type_traits>

template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
process(T value) {
std::cout << "Integral: " << value << std::endl;
}

template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
process(T value) {
std::cout << "Floating-point: " << value << std::endl;
}

int main() {
process(42); // (1)
process(3.14); // (2)
process('A'); // (3)
}


Вопросы:
1. Что напечатает программа?
2. Почему вызов process('A') может удивить?
3. Что произойдёт, если передать true?

🧠 Подвох:

- char — это integral type, а не string и не отдельный класс
- true — это тоже int`-подобный тип: `std::is_integral<bool>::value == true
- У тебя может возникнуть разный вывод в зависимости от перегрузки

Разбор:

- `process(42)` → `Integral: 42`
- `process(3.14)` → `Floating-point: 3.14`
- `process('A')` → `Integral: 65` (ASCII код символа!) ⚠️
- `process(true)` → `Integral: 1` (да, это `bool`)

🎯 Что проверяет задача:

- Понимание `SFINAE` и `enable_if`
- Типовую систему C++ (что именно считается integral)
- Разницу между `char`, `bool`, `int`, `float` в шаблонах
- Предсказание поведения перегрузки на уровне типов

@cpluspluc
🚀 Drogon — современный веб-фреймворк на C++

Если ты разрабатываешь высокопроизводительные REST API, микросервисы или real-time backend на C++, обрати внимание на [Drogon](https://github.com/drogonframework/drogon) — один из самых быстрых и полноценных фреймворков на C++17/20.

🔧 Что умеет Drogon:
Асинхронный event loop (epoll/kqueue)
🧵 Поддержка std::future, coroutines и background-задач
🛡 JWT, HTTPS, CORS, middleware
🔌 Плагины и фильтры для расширяемости
🧠 Встроенный ORM (PostgreSQL, MySQL, SQLite)
🌐 WebSocket и Server-Sent Events (SSE)
🧪 Встроенное тестирование
📄 Автогенерация кода для контроллеров и DTO

📦 Пример Hello World:

drogon::app().registerHandler("/hello", [](const HttpRequestPtr&, std::function<void (const HttpResponsePtr &)> &&callback) {
auto resp = HttpResponse::newHttpResponse();
resp->setBody("Hello, Drogon!");
callback(resp);
}).run();


📁 Также поддерживает:
• Рендеринг HTML-шаблонов
• Хостинг статических файлов
• Генерацию кода через CLI (`drogon_ctl`)

🛠 Установка:

git clone https://github.com/drogonframework/drogon.git
cd drogon && mkdir build && cd build
cmake .. && make && sudo make install


Drogon — лёгкий, мощный и удивительно быстрый фреймворк на C++ для тех, кто хочет выжать максимум из нативного backend-разработки.

🔗 https://github.com/drogonframework/drogon