std::variant
Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке .
Шаблонный класс std::variant похож на упрощенную версию union, но с дополнительной безопасностью типов и поддержкой различных операций.
Основными функциями std::variant являются index(), valueless_by_exception(), operator=, emplace.
В этом примере мы создаем объект var, который может содержать значения типов int, float или std::string. Мы присваиваем var различные значения и получаем их с помощью std::get.
Однако если мы попытаемся получить значение, используя неправильный тип (например, std::get(var), когда вариант содержит std::string), это вызовет исключение std::bad_variant_access.
Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке .
Шаблонный класс std::variant похож на упрощенную версию union, но с дополнительной безопасностью типов и поддержкой различных операций.
Основными функциями std::variant являются index(), valueless_by_exception(), operator=, emplace.
В этом примере мы создаем объект var, который может содержать значения типов int, float или std::string. Мы присваиваем var различные значения и получаем их с помощью std::get.
Однако если мы попытаемся получить значение, используя неправильный тип (например, std::get(var), когда вариант содержит std::string), это вызовет исключение std::bad_variant_access.
Что за оператор −−> в С++?
Это старый хитрый вопрос. В С++ нет оператора −−>.
Рассмотрим такой код:
if (p−−>m == 0) f(p);
Выглядит так, как будто и правда есть оператор −−>, и если правильно объявить переменные p и m, то код даже скомпилируется и запустится:
int p = 2;
int m = 0;
if (p−−>m == 0) f(p);
Это означает: если p−− больше чем m (а это так), то надо сравнить результат (true) с нулём. Ну, true != 0, так что результат всего выражения — false, и функция f() не вызовется. Другими словами:
if ((p−−) > m == 0) f(p);
Пожалуйста, не тратьте много времени на подобные вопросы. Они сбивали с толку новичков ещё до того, как появился С++.
Это старый хитрый вопрос. В С++ нет оператора −−>.
Рассмотрим такой код:
if (p−−>m == 0) f(p);
Выглядит так, как будто и правда есть оператор −−>, и если правильно объявить переменные p и m, то код даже скомпилируется и запустится:
int p = 2;
int m = 0;
if (p−−>m == 0) f(p);
Это означает: если p−− больше чем m (а это так), то надо сравнить результат (true) с нулём. Ну, true != 0, так что результат всего выражения — false, и функция f() не вызовется. Другими словами:
if ((p−−) > m == 0) f(p);
Пожалуйста, не тратьте много времени на подобные вопросы. Они сбивали с толку новичков ещё до того, как появился С++.
memmove
Функция memmove используется для копирования блока памяти из одного места в другое. Она объявлена в заголовочном файле . Она принимает аргументы типа void * и const void *, что позволяет ей работать с любыми типами данных. Она просто копирует указанное количество байтов из исходного буфера в целевой.
memmove может обрабатывать перекрывающиеся буферы. В отличие от memcpy, которая просто копирует данные из одного места в другое, memmove может безопасно перемещать данные, даже если исходный и целевой буферы перекрываются.
Функция memmove может быть полезна для удаления элементов из массива. Например, если вы хотите удалить элемент из массива и сдвинуть оставшиеся элементы влево, вы можете использовать memmove для перемещения данных в массиве.
Функция memmove используется для копирования блока памяти из одного места в другое. Она объявлена в заголовочном файле . Она принимает аргументы типа void * и const void *, что позволяет ей работать с любыми типами данных. Она просто копирует указанное количество байтов из исходного буфера в целевой.
memmove может обрабатывать перекрывающиеся буферы. В отличие от memcpy, которая просто копирует данные из одного места в другое, memmove может безопасно перемещать данные, даже если исходный и целевой буферы перекрываются.
Функция memmove может быть полезна для удаления элементов из массива. Например, если вы хотите удалить элемент из массива и сдвинуть оставшиеся элементы влево, вы можете использовать memmove для перемещения данных в массиве.
Сколько раз будет выполняться этот цикл?
Если бы вы сказали 300, а i был объявлен как int, вы были бы правы. Но поскольку i объявлен как unsigned char, правильный ответ — зацикливание (бесконечный цикл).
Объясняем. Выражение 2 * half_limit будет повышаться до int (на основе правил преобразования C++) и заимеет значение 300. Но так как i — это unsigned char, он пересматривается по 8-битному значению, которое после достижения 255 будет переполняться, поэтому вернется к 0, и цикл будет продолжаться вечно.
Если бы вы сказали 300, а i был объявлен как int, вы были бы правы. Но поскольку i объявлен как unsigned char, правильный ответ — зацикливание (бесконечный цикл).
Объясняем. Выражение 2 * half_limit будет повышаться до int (на основе правил преобразования C++) и заимеет значение 300. Но так как i — это unsigned char, он пересматривается по 8-битному значению, которое после достижения 255 будет переполняться, поэтому вернется к 0, и цикл будет продолжаться вечно.
Memory leak (утечка памяти) — это ситуация, при которой программа использует динамическую память, но забывает освободить эту память перед завершением работы или перед повторным использованием. Как результат, выделенная память остается занята в оперативной памяти, несмотря на то, что она уже не используется, и таким образом происходит утечка памяти.
Утечка памяти может привести к постепенному увеличению объема занятой оперативной памяти программой. Если утечка продолжает развиваться, это может привести к уменьшению производительности программы и даже к завершению программы из-за нехватки доступной памяти.
Утечка памяти может привести к постепенному увеличению объема занятой оперативной памяти программой. Если утечка продолжает развиваться, это может привести к уменьшению производительности программы и даже к завершению программы из-за нехватки доступной памяти.
Какие специальные функции-члены может генерировать сам компилятор? Напишите их сигнатуру?
Ответ:
Компилятор может сам генерировать шесть функций.
• Конструктор по умолчанию;
Object();
• деструктор;
~Object();
• копирующий конструктор;
Object(const Object& oth);
• оператор копирующего присваивания;
Object& operator=(const Object& oth);
• перемещающий конструктор;
Object(Object&& oth);
• оператор перемещающего присваивания;
Object& operator=(Object&& oth);
Ответ:
Компилятор может сам генерировать шесть функций.
• Конструктор по умолчанию;
Object();
• деструктор;
~Object();
• копирующий конструктор;
Object(const Object& oth);
• оператор копирующего присваивания;
Object& operator=(const Object& oth);
• перемещающий конструктор;
Object(Object&& oth);
• оператор перемещающего присваивания;
Object& operator=(Object&& oth);
Форматирование текста в С++20
std::format — это функция форматирования текста, которая появилась в C++20. Она предлагает безопасную и расширяемую альтернативу семейству функций printf. Эта функция предназначена для дополнения существующей библиотеки C++ I/O streams.
В этом примере мы используем std::format для форматирования строки «Hello, {}!», где {} является заполнителем для аргумента «world». Результатом работы этого кода будет строка «Hello, world!», которая выводится на экран с помощью std::cout.
std::format — это функция форматирования текста, которая появилась в C++20. Она предлагает безопасную и расширяемую альтернативу семейству функций printf. Эта функция предназначена для дополнения существующей библиотеки C++ I/O streams.
В этом примере мы используем std::format для форматирования строки «Hello, {}!», где {} является заполнителем для аргумента «world». Результатом работы этого кода будет строка «Hello, world!», которая выводится на экран с помощью std::cout.
Ссылочный и переменный указатель. В чём разница?
Ссылочный указатель — это ссылка на объект. Ссылочный указатель не хранит адрес объекта, а сам является ссылкой на объект. Ссылочный указатель всегда ссылается на один и тот же объект, даже если его значение изменится.
Переменный указатель — это указатель на объект. Переменный указатель хранит адрес объекта. Значение переменного указателя может быть изменено, и в этом случае указатель будет ссылаться на другой объект.
Ссылочный указатель — это ссылка на объект. Ссылочный указатель не хранит адрес объекта, а сам является ссылкой на объект. Ссылочный указатель всегда ссылается на один и тот же объект, даже если его значение изменится.
Переменный указатель — это указатель на объект. Переменный указатель хранит адрес объекта. Значение переменного указателя может быть изменено, и в этом случае указатель будет ссылаться на другой объект.
std::variant
Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке .
Шаблонный класс std::variant похож на упрощенную версию union, но с дополнительной безопасностью типов и поддержкой различных операций.
Основными функциями std::variant являются index(), valueless_by_exception(), operator=, emplace.
В этом примере мы создаем объект var, который может содержать значения типов int, float или std::string. Мы присваиваем var различные значения и получаем их с помощью std::get.
Однако если мы попытаемся получить значение, используя неправильный тип (например, std::get(var), когда вариант содержит std::string), это вызовет исключение std::bad_variant_access.
Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке .
Шаблонный класс std::variant похож на упрощенную версию union, но с дополнительной безопасностью типов и поддержкой различных операций.
Основными функциями std::variant являются index(), valueless_by_exception(), operator=, emplace.
В этом примере мы создаем объект var, который может содержать значения типов int, float или std::string. Мы присваиваем var различные значения и получаем их с помощью std::get.
Однако если мы попытаемся получить значение, используя неправильный тип (например, std::get(var), когда вариант содержит std::string), это вызовет исключение std::bad_variant_access.
Сырые указатели
Сырые указатели — это переменные, которые хранят адрес в памяти, где располагается объект или данные. Сырые указатели могут быть использованы для динамического выделения памяти, работы с массивами, а также для доступа к данным по адресу. Они предоставляют максимальное управление памятью, но требуют осторожного обращения, так как неправильное использование сырых указателей может привести к ошибкам, таким как утечки памяти и ошибки доступа.
Однако, следует помнить, что при использовании сырых указателей нет автоматического управления памятью, и программист должен самостоятельно следить за выделением и освобождением памяти.
Сырые указатели — это переменные, которые хранят адрес в памяти, где располагается объект или данные. Сырые указатели могут быть использованы для динамического выделения памяти, работы с массивами, а также для доступа к данным по адресу. Они предоставляют максимальное управление памятью, но требуют осторожного обращения, так как неправильное использование сырых указателей может привести к ошибкам, таким как утечки памяти и ошибки доступа.
Однако, следует помнить, что при использовании сырых указателей нет автоматического управления памятью, и программист должен самостоятельно следить за выделением и освобождением памяти.
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Вывод типа шаблона (Template Type Deduction)
⚙️ Начиная с C++11 появилась возможность переложить вывод типа на компилятор — вывод типа шаблона (Template Type Deduction)
🔥 Эта фича не только улучшает читаемость, но и делает код более устойчивым к изменениям. Если мы решим изменить тип вектора, нам не нужно изменять сигнатуру функции
⚙️ Начиная с C++11 появилась возможность переложить вывод типа на компилятор — вывод типа шаблона (Template Type Deduction)
🔥 Эта фича не только улучшает читаемость, но и делает код более устойчивым к изменениям. Если мы решим изменить тип вектора, нам не нужно изменять сигнатуру функции
В докладе автор в лёгкой форме рассказывает о C++, его применение, особенностях и всё это переправлено мемами😆
Антон Соснин — С++ в мемах
#junior
Антон Соснин — С++ в мемах
#junior