Может ли класс в С++ реализовывать сразу несколько интерфейсов?
Anonymous Quiz
39%
Да, интерфейсов можно реализовывать сколько угодно
7%
Нет, класс одновременно может реализовать только 1 интерфейс
37%
Интерфейсов как конструкции языка вообще нет в С++
18%
Реализовать можно только 1, а вот наследоваться от любого количества
Как будут вызываться функции g(fun1(),fun2())?
Anonymous Quiz
29%
Компилятор придерживается left-to-right стратегии, поэтому сначала вызов func1(), потом funс2()
9%
Компилятор придерживается right-to-left стратегии, поэтому сначала вызов func2(), потом funс1()
7%
Compiler Error. Недопустимо использовать временные значения в качестве аргументов функции
54%
Порядок вычисления аргументов стандартом не определён. Он может зависеть компилятора и его опций.
В C++ что явно не запрещено, то
Anonymous Quiz
24%
разрешено
6%
запретим потом
59%
может вызвать неопределенное поведение
11%
подлежит обсуждению в стандарте
С PATH_MAX не всё так просто
C и C++ программисты в какой-то момент могут столкнуться с ограниченным размером PATH_MAX и задаться вопросом – какого размера создавать буфер, чтобы отследить путь к директориям или файлам?
https://habr.com/ru/company/pvs-studio/blog/684636/
C и C++ программисты в какой-то момент могут столкнуться с ограниченным размером PATH_MAX и задаться вопросом – какого размера создавать буфер, чтобы отследить путь к директориям или файлам?
https://habr.com/ru/company/pvs-studio/blog/684636/
Хабр
С PATH_MAX не всё так просто
C и C++ программисты в какой-то момент могут столкнуться с ограниченным размером PATH_MAX и задаться вопросом – какого размера создавать буфер, чтобы отследить путь к директориям или файлам?...
Учебник по UE5 C++ | Введение в Unreal Engine 5 с C++ менее чем за 90 минут.
https://youtu.be/nvruYLgjKkk
https://youtu.be/nvruYLgjKkk
YouTube
UE5 C++ Tutorial | Introduction to Unreal Engine 5 with C++ in less than 90 Minutes
Watch the latest UE5 tutorials here: https://youtu.be/g9dU0eCy8RI (Way better quality)
UE5 (Game Engine): https://www.unrealengine.com/en-US/unreal-engine-5
Houdini (3D Modelling Application): https://www.sidefx.com/
Full Playlist: https://youtube.com/…
UE5 (Game Engine): https://www.unrealengine.com/en-US/unreal-engine-5
Houdini (3D Modelling Application): https://www.sidefx.com/
Full Playlist: https://youtube.com/…
#вопросы_с_собеседований
Виртуальный конструктор: что он собой представляет?
Ответ:
Это каверзный вопрос с IT-собеседований, который чаще всего задают после виртуальных деструкторов, чтобы запутать. Конструктор не может быть виртуальным, поскольку в этом нет никакого смысла: при создании объектов нет такой неоднозначности, как при их удалении. 😁
Виртуальный конструктор: что он собой представляет?
Ответ:
Это
Автоматический вывод типа аргумента шаблона класса
Выглядит название этой возможности довольно длинным и сложным, но на самом деле ничего сложного тут нет. Основная идея в том, что в C++17 вывод типов аргументов шаблонов выполняется и для стандартных шаблонов классов. Ранее это поддерживалось лишь для функциональных шаблонов. В результате оказывается, что раньше писали так:
Выглядит название этой возможности довольно длинным и сложным, но на самом деле ничего сложного тут нет. Основная идея в том, что в C++17 вывод типов аргументов шаблонов выполняется и для стандартных шаблонов классов. Ранее это поддерживалось лишь для функциональных шаблонов. В результате оказывается, что раньше писали так:
std::pair<std::string, int> user = {"M", 25};
С выходом C++ 17 эту конструкцию стало можно заменить на эту:std::pair user = {"M", 25};
Вывод типов выполняется неявно. Этим механизмом ещё удобнее пользоваться в том случае, когда речь идёт о кортежах. А именно, раньше приходилось писать следующее:std::tuple<std::string, std::string, int> user ("M", "Chy", 25);
Теперь же то же самое выглядит так:std::tuple user2("M", "Chy", 25);
Тут стоит отметить, что эти возможности не покажутся чем-то достойным внимания тем, кто не особенно хорошо знаком с шаблонами C++.Что не так в этом отрывке кода на С++?
operator int() const {
return *this;
}
Выше приведен полный код для проверки.
Ответ:
Он скомпилируется, хотя некоторые компиляторы могут кинуть warning, сразу же объясняющий в чём суть ошибки. Но вот при запуске вы словите stack overflow. Дело в том, что operator int будет пытаться привести возвращаемое значение к типу int, что вполне можно сделать, ведь для текущего объекта у нас есть замечательный operator int, который это и делает. Т.е. функцию вызовет сама себя и будет продолжать это делать рекурсивно, пока не переполнится стек.
operator int() const {
return *this;
}
Выше приведен полный код для проверки.
Ответ:
Ручное управление памятью с С++ — одновременно один из самых больших плюсов и минусов в языке.
https://habr.com/ru/post/282544/
https://habr.com/ru/post/282544/
Хабр
Garbage Collector & C++
Ручное управление памятью с С++ — одновременно один из самых больших плюсов и минусов в языке. Действительно, эта парадигма позволяет создавать очень производительные программы, однако она же рождает...
Не используйте vector там, где можно было бы обойтись list или deque
Контейнер
С другой стороны, использование
Контейнер
vector предназначен для хранения в памяти непрерывной последовательности байтов. Поэтому при добавлении новых элементов, если памяти не хватит, контейнеру придется выделить новую память и копировать данные из старого места в новое. Если это происходит часто, то производительность кода может быть снижена значительно. В отличие от vector, контейнеры list или deque не хранят непрерывную последовательность данных, поэтому копирование не требуется.С другой стороны, использование
vector с предварительным резервированием (т. е. однократным выделением всей необходимой памяти) — самый быстрый и экономный способ. Потому что в случае list или deque небольшие куски памяти выделяются много раз. При выборе контейнера следует думать, какие именно операции над ним будут выполняться.#вопросы_с_собеседований
Что дают разные модификаторы при наследовании?
Ответ:
Изменяют зону видимости членов базового класса.
При private наследовании protected и public члены становятся private. При protected наследовании public становится protected. А при public ничего не изменяется.
Что дают разные модификаторы при наследовании?
Ответ:
При private наследовании protected и public члены становятся private. При protected наследовании public становится protected. А при public ничего не изменяется.
Лямбда-выражения
В C++ 11 появилась поддержка лямбда-выражений. Они напоминают анонимные функции в JavaScript, их можно сравнить с функциональными объектами без имён. Они захватывают переменные в различных областях видимости в зависимости от их описания, для которого используются компактные синтаксические конструкции. Кроме того, их можно назначать переменным.
Лямбда-выражения — весьма полезный инструмент для тех случаев, когда в коде нужно выполнить какую-нибудь небольшую операцию, но для этого не хочется писать отдельную функцию. Ещё один распространённый пример их использования — создание функций, используемых при сравнении значений.
В C++ 11 появилась поддержка лямбда-выражений. Они напоминают анонимные функции в JavaScript, их можно сравнить с функциональными объектами без имён. Они захватывают переменные в различных областях видимости в зависимости от их описания, для которого используются компактные синтаксические конструкции. Кроме того, их можно назначать переменным.
Лямбда-выражения — весьма полезный инструмент для тех случаев, когда в коде нужно выполнить какую-нибудь небольшую операцию, но для этого не хочется писать отдельную функцию. Ещё один распространённый пример их использования — создание функций, используемых при сравнении значений.
#вопросы_с_собеседований
Можно ли использовать ссылку при возвращении из функции? Это хорошо или плохо?
Нельзя:
• никогда нельзя возвращать ссылку на локальную переменную, созданную внутри функции, потому что она разрушится сразу после выхода из функции;
• нельзя возвращать ссылку на выделенную память, потому что её нельзя будет очистить.
Можно:
• когда возвращается константная ссылка на член класса;
• когда Вы пишете оператор <<, оператор = и оператор индексирования, они должны возвращать ссылку на объект.
Возвращать ссылку - это хорошо, потому что не вызывается лишний копирующий конструктор для возвращаемого значения, но, иногда лучше и правильнее возвращать по значению.
Можно ли использовать ссылку при возвращении из функции? Это хорошо или плохо?
Нельзя:
• никогда нельзя возвращать ссылку на локальную переменную, созданную внутри функции, потому что она разрушится сразу после выхода из функции;
• нельзя возвращать ссылку на выделенную память, потому что её нельзя будет очистить.
Можно:
• когда возвращается константная ссылка на член класса;
• когда Вы пишете оператор <<, оператор = и оператор индексирования, они должны возвращать ссылку на объект.
Возвращать ссылку - это хорошо, потому что не вызывается лишний копирующий конструктор для возвращаемого значения, но, иногда лучше и правильнее возвращать по значению.