Senior C++ Developer – Telegram
Senior C++ Developer
12.3K subscribers
1.36K photos
3 videos
610 links
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
#вопросы_с_собеседований
Можно ли использовать ссылку при возвращении из функции? Это хорошо или плохо?

Нельзя:
• никогда нельзя возвращать ссылку на локальную переменную, созданную внутри функции, потому что она разрушится сразу после выхода из функции;
• нельзя возвращать ссылку на выделенную память, потому что её нельзя будет очистить.

Можно:
• когда возвращается константная ссылка на член класса;
• когда Вы пишете оператор <<, оператор = и оператор индексирования, они должны возвращать ссылку на объект.

Возвращать ссылку - это хорошо, потому что не вызывается лишний копирующий конструктор для возвращаемого значения, но, иногда лучше и правильнее возвращать по значению.
Алгоритм lower_bound

Возвращает итератор, указывающий на первую позицию в отсортированной последовательности, ограниченной диапазоном [first, last), в которую можно вставить значение value, не нарушая упорядоченности.
Что выведет код?
Anonymous Quiz
8%
11
6%
00
47%
22
13%
12
5%
02
23%
Другое
Компилятор C++ может динамически встраивать функции во время выполнения.

https://github.com/drti
Minetest — это воксельный игровой движок с открытым исходным кодом, который легко модифицировать и создавать игры.

https://www.libhunt.com/r/minetest
Что выведет код?
Anonymous Quiz
34%
210
2%
120
5%
021
35%
012
2%
201
22%
Другое
#вопросы_с_собеседований по Си
Что такое void указатель? Можно ли разыменовать указатель void, не зная его типа?

void указатель — это указатель, который можно использовать для указания на любые данные любого произвольного типа. Указатель void может быть разыменован только после явного приведения. Например:
int a = 5;
void *b = &a;
printf(“%d\n”, *((int*)b));
Что выведет код?
Anonymous Quiz
10%
12
64%
13
10%
31
6%
50
10%
11
Генерация исходного кода C++ (ориентация на данные финансового рынка).

https://lucisqr.substack.com/p/source-code-generation
#вопросы_с_собеседований
Есть ли разница между классом и структурой?

Единственная разница между классом и структурой — это модификаторы доступа. Члены структуры по умолчанию public; члены класса являются приватными. Рекомендуется использовать классы, когда вам нужен объект с методами, и структуры, когда у вас есть простой объект данных.
#вопросы_с_собеседований
Когда следует использовать виртуальное наследование?

Хотя идеально вообще избегать виртуального наследования (вы должны знать, как будет использоваться ваш класс), все же важно иметь четкое представление о том, как работает виртуальное наследование:

Итак, когда у вас есть класс (класс A), который наследуется от двух родителей (B и C), оба из которых имеют общего родителя (класс D), как показано на картинке. Если вы не используете виртуальное наследование в этом случае, вы получите две копии D в классе A: одну из B и одну из C. Чтобы это исправить, вам нужно изменить объявления классов C и B на виртуальные:
class C:  virtual public D {
};

class B: virtual public D {
};
#вопросы_с_собеседований
Предполагая, что buf является валидным указателем, в чем проблема в приведенном на картинке коде? Каким был бы альтернативный способ реализации этого, который позволил бы избежать этой проблемы?

Проблема в коде заключается в том, что --sz >= 0 всегда будет истинным, поэтому вы никогда не выйдете из цикла while (поэтому вы, вероятно, в конечном итоге испортите память или вызовете какое-то нарушение памяти или какой-либо другой программный сбой, в зависимости от того, что вы делаете внутри цикла). Причина, по которой --sz >= 0 всегда будет истинной, заключается в том, что тип sz равен size_t. size_t на самом деле просто псевдоним одного из основных беззнаковых целочисленных типов. Следовательно, поскольку sz не имеет знака, оно никогда не может быть меньше нуля (поэтому условие никогда не может быть ложным). Одним из примеров альтернативной реализации, позволяющей избежать этой проблемы, может быть использование цикла for следующим образом:
for (size_t i = 0; i < sz; i++)