Листинг 14.13. «Манипулятор» для двоичного вывода
class binary { unsigned long k; public:
binary(unsigned long k): k(k) {}
friend ostream& operator<<(ostream& os, const binary& t);
};
inline ostream& operator<<(ostream& os, const binary& t)
{ const unsigned long MAX = numeric_limits<unsignecPlong>::max();
unsigned long bit = -(MAX >> 1); // старший бит
while(bit) { os << (t.k & bit?11':'0'); bit >>= 1; }
return os;
}
В функции ope r a tor << самыми важными являются две строки:
const unsigned long MAX = numeric_limits<unsigned long>::max();
unsigned long bit = -(MAX >> 1): // старший бит
В первой строке в переменную МАХ заносится максимально возможное беззнаковое целое число, определенное в стандартном классе числовых пределов numeric_limi ts.
ПРИМЕЧАНИЕ
Класс-шаблон numeric_limits<> определен в заголовке <limits>.
В двоичной записи это максимальное число представляет собой набор единичных битов:
1111...111
Во второй строке все биты числа сдвигаются вправо на один разряд; самый правый бит (младший разряд числа) теряется; в самый левый бит (старший разряд числа) заносится нуль, так как тип — беззнаковый. Таким образом, в результате сдвига образуется такая конфигурация битов:
0111...111
Потом эта конфигурация инвертируется операцией ~ и превращается в
1000...000
Это значение и заносится в переменную bit. Далее старшая единичка в цикле сдвигается на 1 разряд, пока значение bit не станет равно нулю.
Если у вас сломался компьютер, тогда вам необходим http://maxcomputer.ru/, которого вы можете найти тут.
Alarm
{ Alarm а;
settime(a);
// нормально
}
void f2() { Alarm a;
settime(a);
// ошибка трансляции
В этом примере мы путем закрытого наследования закрыли доступ к «внутренностям» класса Alarm, но объявили функцию f 1() другом. Как указано Гербом Саттером в [21], «код с доступом к закрытым частям Derived может полиморфно использовать объекты Derived вместо объектов Base». Такой доступ имеют методы и функции-друзья. |