Перевод заметки за авторством Андреа Джигенти, производственного менеджера Riplife Gaming Technologies. Лицензия — Creative Commons.
В языке C++ наследование и полиморфизм — очень важные понятия. Эта тема довольно обширна, для её понимания необходимо хорошо уяснить для себя, как объекты реального мира соотносятся с объектами в языке, как и когда происходит создание и уничтожение объектов, как работать с памятью, ссылками, указателями и зачем необходимы списки инициализации. Не лишним будем знание стандартных контейнеров, умных указателей и понимание смысла константности.
Напишем класс Pancake. Добавим три поля: радиус блинчика, толщину и сорт муки. Конструктор этого класса снабдим списком инициализации. Последний штрих — напишем функцию print().
class Pancake
{
public:
Pancake(int radiusMm, int thicknessMm, int flourSort) :
radiusMm_(radiusMm),
thicknessMm_(thicknessMm),
flourSort_(flourSort)
{
}
void print() const
{
std::cout << "Pancake." << std::endl;
}
protected:
unsigned radiusMm_; // RRRRRRRR RRRRRRRR RRRRRRRR RRRRRRRR
unsigned thicknessMm_; // TTTTTTTT TTTTTTTT TTTTTTTT TTTTTTTT
char flourSort_; // SSSSSSSS 00000000 00000000 00000000
};
В новой операционной системе Windows 10 появился браузер Microsoft Edge. Project Spartan — его кодовое название. Internet Explorer никуда не делся, более того — в браузере Edge есть пункт меню «Открыть в Internet Explorer». Что же собой представляет этот «абсолютно новый браузер для Windows 10», «разработанный для письма, чтения, исследований и работы непосредственно в интернете»?
Вот что я увидел при первом запуске.
Лишь повторю за маркетологами: «Microsoft Edge: больше, чем просто просмотр веб-страницы».
Сегодня речь пойдёт о некоторых современных «веяниях» в веб-дизайне. Дух времени диктует: сайт должен работать на разных платформах, на устройствах с разным разрешением, выглядеть аккуратно, вести себя предсказуемо и так далее. Индустрия подарила нам для этого средства, которые с лёгкостью позволяют это делать. Однако способы их реализации и то, как веб-дизайнеры всем этим пользуются, — достаточный повод для того, чтобы поругаться.
Посмотрите — красота.
Сейчас в интернете будет шквал обзоров новой операционной системы от Microsoft — Windows 10. Но у меня нет цели делать полные обзоры, хочется лишь поделиться своим негодованием. Как обычно, дьявол кроется в деталях. А вот и он.
Заходим в синтетический заменитель панели управления: Параметры → Обновление и безопасность → Центр обновления Windows. Вчитываемся.
Плавающая запятая даёт много преимуществ, но «заплыв» этот полон моментов, требующих понимания и тщательного подхода. Числа с плавающей запятой используются слишком часто, чтобы пренебрегать их глубоким пониманием. Поэтому нужно хорошо разбираться, как представлены числа с плавающей запятой и как работают вычисления с ними.
Число с плавающей запятой представлено в следующем виде:
$$N=(-1)^{s}\cdot m \cdot 2^{e},$$
где \(m\) — мантисса (23 бита — дробная часть мантиссы и неявно заданный ведущий бит, всегда равный единице, поскольку мантисса хранится в нормализованном виде), \(e\) — смещённая экспонента/порядок (8 бит). Один бит отводится под знак (\(s\), бит равен нулю — число положительное, единице — отрицательное).
Тип double полностью аналогичен float, он лишь содержит больше битов мантиссы и порядка.
Рассмотрим какой-нибудь пример. Число \(3{,}5\) будет представлено в следующем виде:
В прошлой статье разбирались достоинства и недостатки различных форм представления массивов в памяти. В этот раз рассмотрим трёхмерный случай (и вообще \(N\)-мерный) и обратим внимание на то, как производится пересчёт логических координат в фактические.
Сперва вернёмся к двумерному случаю. Обращение к \(j\)-у элементу, раположенному в \(i\)-й строке, выглядит следующим образом: array_of_a_healthy_man[i * w + j] (\(w\) — количество элементов в строке). На рисунке представлено логическое и фактическое представление двумерного массива. Таким образом, слагаемое \(i \times w\) означает «пропустить \(i\) строк, содержащих по \(w\) элементов».
Задача проста: организовать хранение двумерного массива. Во время написания некоторой программы один из моих учеников использовал два разных способа представления двумерного массива в памяти, оба из них не были эффективными, хотя вопрос хранения данных на стеке и в куче уже нами обсуждался. Другой студент, когда я попросил прокомментировать разные способы выделения памяти, испытал затруднения. Получается, что всё бывает не так очевидно, как кажется. А представить визуально и сказать с использованием точных терминов то, что описывается в коде, и вовсе оказывается сложной задачей.
Пусть необходимо хранить следующий массив элементов типа int размерностью \(5\times 10\).
\(35\ 58\ 73\ 32\ 35\ 32\ 59\ 95\ 19\ 39\\ 64\ 54\ 45\ 73\ 52\ 20\ 92\ 76\ 94\ 92\\ 47\ 93\ 65\ 14\ 25\ 92\ 27\ 93\ 14\ 94\\ 90\ 45\ 85\ 31\ 69\ 32\ 95\ 12\ 87\ 53\\ 75\ 11\ 47\ 72\ 33\ 42\ 58\ 62\ 57\ 85\)
Самый адекватный вариант в большинстве случаев — выделить в куче один массив для всех элементов.
const int w = 10, h = 5;
int* array_of_a_healthy_man = new int[h * w];
Компания «Майкрософт» ещё год назад порадовала своим шедевром автоматического перевода: «Шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон».
Но на этот раз они превзошли сами себя.
warning CS0108: BezierCurve.GetObjectData(...) скрывает наследуемый член...
Если скрытие было намеренным, используйте новое ключевое слово.
В случае первого сообщения об ошибке хоть что-то понятно, можно ведь и поискать вариант на языке оригинала. В случае второго сообщения понятно всё — и не понятно ничего. Если я должен использовать ключевое слово, то какое? Почему его от меня скрывают?
Недолгий поиск позволил выяснить, что последняя часть сообщения в оригинале звучала так: «Use the new keyword if hiding was intended». То есть: «Используйте ключевое слово new, если сокрытие было намеренным».
Из лекции Александра Степанова «Наибольшая общая мера последние 2500 лет».
Перевод заметки за авторством Андреа Джигенти, производственного менеджера Riplife Gaming Technologies. Лицензия — Creative Commons.