Как подсчитать число выставленных битов (единиц) в целом беззнаковом? Давайте возьмем C++ 20, где в <bit> появилась функция std::popcount, которая делает, то что нам нужно: #include <iostream> #include <bit> #include <cstdint> int main() { uint8_t u1 = 0b00011101; unsigned u2 = 123; // 0b1111011 std::cout << std::popcount(u1) << " " << std::popcount(u2) << std::endl; // 4 6 return 0; } Скучно? На первый взгляд да, но в C++ всегда можно закопаться в детали =) Во-первых, что за странное название? ...
Маша С++
Учу C++ и не только вместе с вами, мои котятки)
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20Давайте посмотрим на такой пример заголовочного файла (.h) c использованием указателя на incomplete тип (forward declaration): #include <memory> class ForwardDClass; class WithSmartPtr { public: WithSmartPtr() = default; ~WithSmartPtr() = default; private: ForwardDClass rawPtr_; //std::shared_ptr<ForwardDClass> sPtr_; //std::unique_ptr<ForwardDClass> uPtr_; }; int main(int argc, char argv<::>) { WithSmartPtr w; return 0; } Не будем вдаваться в корректность, посмотрим для начала на компилируемост...
Дочитываю книгу "Многопользовательские игры. Разработка сетевых приложений". Неплохое введение в компьютерные сети для тех кто хочет быстро разобраться или вспомнить как работает IP, Nat и тп, а также вводная глава про программирование сетевых сокетов. Примеры на C++. #книги
Нам всегда говорили, что бросать исключения из деструктора это плохая идея. Один из примеров плохого результата - это раскручивание стека при обработке исключения, когда вызываемые деструкторы приводят к повторному исключению, которое кроме как вызовом terminate() толком не обработаешь. Но что, если выбросить исключение очень хочется, ведь мы сделаем всё "аккуратно"? Давайте посмотрим на такой код: #include <iostream> struct ThrowsInDtor { ~ThrowsInDtor() { std::cout << "~ThrowsInDtor" << std::e...
Объединения (union-ы) позволяют хранить данные разных типов в одной области памяти. Пример: #include <iostream> union IPv4Address { uint32_t i; uint8_t c[4]; }; int main(int argc, char* argv<::>) { IPv4Address a; memset(&a, 0, sizeof(a)); a.c[0] = 10; a.c[1] = 0; a.c[2] = 0; a.c[3] = 1; std::cout << (int)a.c[0] << std::endl; std::cout << a.i << std::endl; // don't do this, just an example return 0; } Но можно ли наследовать union? Давайте попробуем: struct IPv4AddressWithPort : IPv4Address { uin...
Многим известно как работает dynamic_cast в C++. Зная, что за указателем на базовый класс стоит объект производного, мы можем скастовать базовый до производного и вызвать его метод. Пример: struct Base { virtual ~Base() = default; }; struct Derived : public Base { void doDerivedJob() { std::cout << "derived" << std::endl; } }; void cast(Base baseP) { Derived d = dynamic_cast<Derived>(baseP); if (d) { d->doDerivedJob(); } else { std::cout << "ptr: unable to cast" << std::endl; } } int main(int ar...
Как можно оформить в C++ длинный строковый литерал и разбить его на нескольксо строк в коде? Допустим, мы хотим разбить длинную строку в коде на несколько линий, но так чтобы переносы строк и отступы из самого кода не повлияли на результат. Один из проcтейших способов - просто написать строки в кавычках друг за другом: std::string str1 = "Если ты, следуя правому разуму, будешь старательно," " ревностно и любовно относиться к делу, которым ты в" " данный момент занят..."; std::cout << str1 << std...
Многим известно, что std::string можно создать из указателя на char (допустим из некой C-шной функции): #include <iostream> #include <string> static std::string str = "OK"; const char getStr() { return str.c_str(); } int main() { std::cout << "str: " << std::string(getStr()) << std::endl; } Но что будет, если нам прилетит nullptr и мы передадим его в конструктор std::string? const char* getStr() { return nullptr; //return str.c_str(); } Можно подумать, что создастся пустая строка. В конце концов...
#база Какой из обработчиков catch сработает в таком коде? #include <iostream> class BaseException : public std::exception {}; class DerivedException : public BaseException {}; int main(int argc, char* argv<::>) { try { throw DerivedException(); } catch (const std::exception&) { std::cout << "std::exception" << std::endl; } catch (const BaseException&) { std::cout << "BaseException" << std::endl; } catch (const DerivedException&) { std::cout << "DerivedException" << std::endl; } return 0; } Не см...
По умолчанию, при форматировании вывода в поток булевых значений, будет использоваться 1 и 0 для true и false. Пример: bool t = true; bool f = false; std::cout << t << " " << f << std::endl; // Выведет: 1 0 Возможно, что удобнее (особенно для отладки) выводить булевы значения строкой, также как они задаются в коде. Для этого нужно добавить в поток манипулятор boolalpha: std::cout << std::boolalpha; std::cout << t << " " << f << std::endl; // Выведет: true false Интересно то, что манипулятор дейс...