Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 52

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 46 47 48 49 50 51 < 52 > 53 54 55 56 57 58 .. 204 >> Следующая

• Виртуальным функциям свойственен полиморфизм — способность использовать один оператор для выполнения любого из множества различных действий. При этом конкретное действие определяется типом вызываемого объекта.
• Используя виртуальные функции, можно создавать простые универсальные подпрограммы для управления множеством различных (но связанных) объектов.
• Виртуальные функции позволяют изменять настройки базового класса, принятые по умолчанию, без модификации исходного кода базового класса.
В следующей главе рассмотрены некоторые дополнительные свойства языка С++, также имеющие отношение к классам.
Глава 6
Перегрузка, копирование и преобразование
• Перегрузка операторов
• Применение конструкторов копирования и преобразования
В этой главе рассмотрены способы настройки созданных классов. Особое внимание уделено процедуре перегрузки (overloading) стандартных операторов языка С++, позволяющей описывать их поведение при работе с объектами классов. Рассмотрено также определение специальных конструкторов, инициализирующих объект класса другим объектом такого же типа (конструкторы копирования — copy constructors) или преобразовывающих данные различных типов в объект класса (конструкторы преобразования — conversion constructors).
Перегрузка операторов_
Операторы C++ применяются к данным встроенных типов заранее определенным способом. Например, при применении операции сложения к двум переменным типа int выполняется целочисленное сложение, а при использовании оператора "+" для двух переменных типа double — операция сложения с плавающей запятой. В языке C++ допустимо применение стандартных операторов к объектам классов при условии точного описания их действия. Определение способа работы оператора с объектами конкретного класса называется перегрузкой оператора.
Предположим, имеется класс CCurrency, предназначенный для хранения и обработки денежных сумм.
class CCurrency {
private:
long Dollars;
int Cents; public:
CCurrency () {
Dollars = Cents = 0; }
CCurrency (long Dol, int Cen) {
SetAmount (Dol, Cen) ; }
void GetAmount (long *PDol, int *PCen) {
*PDol = Dollars;
*PCen = Cents; }
void PrintAmount () {
cout.fill('0'); cout.width (1);
cout « '$' « Dollars « '.';
cout.width (2);
cout « Cents « '\n*;
}
void SetAmount (long Dol, int Cen) {
// проверка суммы центов, которая превышает 100: Dollars = Dol + Cen / 100; Cents = Cen % 100; }
};
В классе ccurrency денежные суммы хранятся в виде целочисленных величин, предназначенных для последующей обработки с использованием быстродействующих целочисленных операций. Класс содержит конструктор по умолчанию для установки начальных значений переменных, содержащих количество долларов и центов, в 0 и конструктор для присвоения этим переменным конкретных значений. Предусмотрены отдельная функция-член (SetAmount) для задания величины денежной суммы и функции-члены GetAmount и PrintAmount для подсчета суммы и ее печати соответственно. Заметим: можно хранить значение суммы в одной переменной long integer в виде общей суммы в центах, что позволяет обрабатывать большие числа. Однако предпочтительнее для хранения величины, обозначающей количество долларов, использовать переменную типа long, а для центов — переменную типа int. В результате можно будет оперировать количеством долларов, достигающим максимальной величины типа long, что в системе программирования Visual С++ составляет 2147483647.
Примечание
Несмотря на то, что в Visual С++ 6 размер переменной типа int совпадает с размером переменной типа long (4 байта), переменная Dollars явно объявлена как переменная типа long для того, чтобы она могла содержать максимально возможные целочисленные значения при использовании любого компилятора.
Вместо задания функций-членов для арифметических операций с денежными суммами, можно перегрузить стандартные операторы С++. Это позволяет выполнять арифметические действия, применяя выражения, традиционно используемые для встроенных типов данных. Для перегрузки оператора определяется функция с именем operator, за которым следует обозначение операции. Например, можно перегрузить оператор "+", добавив в определение класса ccurrency следующую функцию-член.
class CCurrency (
// другие объявления ...
public:
CCurrency operator* (CCurrency Curr) {
CCurrency Temp (Dollars + Curr.Dollars, Cents + Curr.Cents);
return Temp;
)
// другие объявления ... };
Функция-оператор определяется как public, чтобы ее могли использовать другие функции-программы. Если такая функция задана, операцию сложения можно реализовать следующим образом.
CCurrency Amountl (12, 95); CCurrency Amount2 (4, 38}; CCurrency Total;
Total = Amountl + Amount2; Компилятор языка С++ интерпретирует выражение Amountl + Amount2 как Amountl.operator* (Amount2);
Функция operator* создает временный объект Temp класса CCurrency, содержащий размер денежной суммы, полученной в результате сложения двух объектов. Затем она возвращает временный объект. Кроме того, приведенное выше выражение присваивает возвращаемый объект экземпляру Total класса CCurrency. Такой способ присваивания делает возможным поэлементное копирование компилятором переменных-членов одного класса в другой.
Предыдущая << 1 .. 46 47 48 49 50 51 < 52 > 53 54 55 56 57 58 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100