Академия Кода – Telegram
Академия Кода
2K subscribers
673 photos
2 videos
2 files
50 links
Академия кода. Полезный контент по программированию. По всем вопросам @evgenycarter
Download Telegram
Строковые литералы как параметры шаблона

Начиная с C ++ 20, вы можете использовать строку в качестве параметра шаблона, не являющегося типом. Идея состоит в том, чтобы использовать стандартную строку basic_fixed_string, которая имеет конструктор constexpr. Конструктор constexpr позволяет ему создать экземпляр фиксированной строки во время компиляции.

Вроде бы мелочь, а приятно — не нужно производить обходных маневров и использовать лишнюю память.

#cpp

Подписывайтесь на канал 👉@cod_academy
Как сборка мусора (Garbage Collection) не допускает нехватку памяти в приложении на Java?

Ответ:
Сборщик мусора (Garbage Collector) в Java — не волшебная пилюля от нехватки памяти в приложениях. Он просто очищает неиспользуемую память, когда объект выходит из области видимости и в нём отпадает потребность. Так что никакой гарантии, что сборка мусора предотвратит ошибки, связанные с нехваткой памяти, нет.

#java

Подписывайтесь на канал 👉@cod_academy
Символы экранирования

При выводе строки иногда появляются различные непонятные нам символы вроде '\n'. Подобные записи всегда начинаются с '\' (обратный слеш), и могут состоять из нескольких символов, но Python считает их за один. Если эту тему изучить, то можно делать интересные вещи в одну строчку, либо красиво оформлять вывод.

Вод пример самых частых символов:
\\ - Сам символ обратного слеша (остается один символ \)
\' - Апостроф (остается один ')
\" - Кавычка (остается один символ ")
\n - Новая строка (перевод строки)
\r - Возврат каретки
\t - Горизонтальная табуляция

Но для тех, кто этого не знает могут возникнуть проблемы. Например, если вы попробуете задать адрес на вашем компьютере. А он состоит из символов '/', вам интерпретатор выдаст ошибку.

Можно, конечно, воспользоваться нашим знанием и написать, экранировав все слеши, но есть более простой способ отменить экранирование - поставить r перед строчкой.

#python

Подписывайтесь на канал 👉@cod_academy
Проверка специализации типа

Иногда встает задача проверить, является ли конкретный тип данных специализацией определенного шаблона. Для этого можно использовать синтаксис шаблонов template.

#cpp

Подписывайтесь на канал 👉@cod_academy
Сколько объектов типа String создает эта программа?

Ответ:
Программа создаст два string-объекта. Когда мы создаем строку, используя оператор new, она сначала создастся в Java String Pool и только потом в куче (heap memory). Но только при условии, что этой строки ещё нет в пуле Java String.

#java

Подписывайтесь на канал 👉@cod_academy
Оформление кода

Все вы знаете, что в python есть своя философия. Именно отсюда берутся определенные правила и стандарты. В пайтон такое соглашение назвали PEP 8 (читается - пэп).

Соответствие пепу позволяет видеть основную структуру вашего кода другим разработчикам. Не нужно привыкать к другому оформлению кода. Если вы привыкли как-то оформлять код, а увидели что-то совершенно другое, то вы поймете.

#python

Подписывайтесь на канал 👉@cod_academy
malloc стал безопасен

В предыдущих версиях использование низкоуровневых функций, унаследованных из языка Си, не рекомендовалось. Проблема в том, что Си оперирует байтами, а в С++ происходит работа с объектами со своим временем жизни и областью видимости. До С++ 20 время жизни объекта начиналось после вызова оператора new. В новой версии все изменилось — принято считать, что набор низкоуровневых функций — memcpy, memmove, malloc, aligned_alloc, calloc, realloc, bit_cast, начинает время жизни объекта. Т. е. следующий код(см картинку) будет валиден.

Т. е. у нас появляется обратная совместимость с языком Си, но относительно С++ в новой трактовке.

#cpp

Подписывайтесь на канал 👉@cod_academy
Ключевое слово abstract в Java

abstract - это модификатор, применимый для классов, методов, но не для переменных. Он используется для достижения абстракции, которая является одним из столпов объектно-ориентированного программирования. Рассмотрим варианты применения abstract:

1. Класс, имеющий частичную реализацию (т.е. не все методы, присутствующие в классе, определены).
2. Иногда требуется объявление нереализованного метода в суперклассе. Этого можно добиться, указав модификатор abstract.

#java

Подписывайтесь на канал 👉@cod_academy
Бесконечные списки

Мы уже рассказывали про важность копирования списков. Но именно из-за такой процедуры появляется возможность создавать бесконечные списки. Дойти до конца такого списка невозможно, при этом он потребляет минимум памяти. Попробуйте создать сами.

На картинке (см. выше) видно создание. А затем мы пробуем модуль copy, чтобы узнать сможет ли он сделать глубокое копирование бесконечного объекта?

Применить знание особо негде, но данное задание помогает понять работу списков. Возможно, такой вопрос задаст вам рекрутер на одном из собеседований.

#python

Подписывайтесь на канал 👉@cod_academy
Проверка возможности конструирования элемента с набором конкретных параметров

Когда шаблонный класс задан в виде template<class T, typename... Args>, бывает трудно понять, какие аргументы можно использовать. Метод is_constructible из библиотеки type_traits даёт неполный ответ: он показывает, существует ли конструктор под конкретные аргументы. Для более полной картины можно использовать еще один шаблон.

#cpp

Подписывайтесь на канал 👉@cod_academy
Что выведет эта программа?

Ответ:
Программа напечатает “String method”. Прежде всего стоит отметить, что null не является объектом в Java. Но null можно присвоить любой ссылке. Java String является объектом класса java.lang.String. В этой программе компилятор Java выбирает вызов перегруженного метода с наиболее конкретными параметрами. Это будет String, потому что класс String более конкретен, чем класс Object.

#java

Подписывайтесь на канал 👉@cod_academy
Анонимные функции

Часто функции нужны только один раз, причем короткие. И избыточно создавать под них функцию и придумывать ей имя.

Для таких случаев существуют лямбда функции, так выглядит их создание:
<аргументы>: <выражение>

Такие функции обязан знать каждый программист, их применение сильно сокращает код.

#python

Подписывайтесь на канал 👉@cod_academy
1
Избавляемся от макросов

В целом, разработчики стандарта стараются исключить препроцессор. Как следствие, в новой версии можно не пользоваться макросами FILE и LINE, а взамен использовать std::source_location(см картинку).

Как мы видим, код становится более единообразным, в одном стиле, с расширяемым функционалом.

#cpp

Подписывайтесь на канал 👉@cod_academy
Можно ли предопределить или перегрузить статический метод в Java?

Перегрузить статический метод в Java можно, но вот предопределить его нельзя. Вы можете написать другой статистический метод с такой же сигнатурой в подклассе, но он не будет предопределять суперкласс. в Java это называется сокрытием методов.

#java

Подписывайтесь на канал 👉@cod_academy
Конструктор класса

У классов практически во всех языках есть конструкторы — это такие специальные методы, которые вызываются автоматически и инициализируют экземпляр класса.

В Python конструкторы в классах имеют название __init__(), и их почти всегда переопределяют. Делается это для того, чтобы назначить свойства объекту и выполнить предварительные действия.

#python

Подписывайтесь на канал 👉@cod_academy
Вызов функции через кортеж

Креативное применение шаблонов, которое позволяет вызвать любую функцию, передав в неё параметры в виде кортежа.

#cpp

Подписывайтесь на канал 👉@cod_academy
👍1
Выполнится ли блок finally, если блок try или catch выполняют инструкцию return?

Да, блок finally выполнится, даже если return выполнился в блоке try или catch. Это один из самых популярных и сложных вопросов по Java. Запомните: единственный способ остановить выполнение блока finally — использовать System.exit().

#java

Подписывайтесь на канал 👉@cod_academy
Функции высшего порядка

Функции высшего порядка - функции принимающие или возвращающие другие функции. Очень говорящее название, запомнить очень просто

Чуть ранее мы говорили про lambda, они очень хорошо взаимодействуют с высшими функциями. Про одну из них мы говорили - map(). Она может принимать в себя лямбду, но это не дает такой большой функциональности.

Еще одна функция-итератор - filter()
Она поможет отфильтровать списки или итераторы. Первым принимает функцию, если она возвращает True, то пропускает элемент, вторым аргументом принимает список или итератор.

Не забывайте комбинировать функции!

#python

Подписывайтесь на канал 👉@cod_academy
Как вызвать функцию C в программе на C++?

Еще один популярный вопрос с собеседований, рассчитанный на новичков, совершенно не представляющих, как такое возможно. На самом же деле возможно, если использовать extern «C».

#cpp

Подписывайтесь на канал 👉@cod_academy
👍1
FileOutputStream vs. FileWriter

Запись файлов на Java осуществляется двумя способами: FileOutputStream и FileWriter. Какой именно метод выбрать, зависит от конкретной задачи.

FileOutputStream предназначен для записи потоков необработанных байтов. Это делает его идеальным решением для работы, например, с изображениями.

У FileWriter другое призвание: работа с потоками символов. Так что если вы пишете текстовые файлы, выбирайте этот метод.

#java

Подписывайтесь на канал 👉@cod_academy
Как вывести все методы класса в Python?

Для того, чтобы вывести все методы класса, Вы можете воспользоваться методами dir(), callable(), getattr()

#python

Подписывайтесь на канал 👉@cod_academy