class Savings
{
public :
unsigned accountNumber ;
float balance ;
} ;
Каждый экземпляр класса Savings содержит одинаковые элементы:
void fn( void )
{
Savings a ;
Savings b ;
a.accountNumber = 1 ; /* этот счёт не тот же, что и... */
b.accountNumber = 2 ; /* ...этот */
}
Переменная а.accountNumber отличается от переменной b.accountNumber. Эти переменные различаются между собой так же, как баланс моего банковского счёта отличается от вашего ( хотя они оба называются балансами ).
►Активизация объектов...154
Классы используются для моделирования реально существующих объектов. Чем ближе объекты С++ к реальному миру, тем проще с ними работать в программах. На словах это звучит довольно просто, однако существующий сейчас класс Savings не предпринимает ничего, чтобы хоть в чём-то походить на настоящий банковский счёт.
_________________
154 стр. Часть 3. Введение в классы
Моделирование реальных объектов...155
Реальные объекты имеют свойства-данные, например номера счетов и балансы. Но кроме этого, реальные объекты могут выполнять действия: микроволновые печи готовят, сберегательный счёт начисляет проценты, полицейский выписывает штраф и т.д.
Функционально ориентированные программы выполняют все необходимые действия с помощью функций. Программа на С++ может вызвать функцию strcmp( ) для сравнения двух строк или функцию getLine( ) для ввода строки. В главе 24, "Использование потоков ввода-вывода", будет показано, что даже операторы работы с потоками ввода-вывода ( cin >> и cout << ) являются не чем иным, как особым видом вызова функции.
Для выполнения действий классу Savings необходимы собственные активные свойства:
class Savings
{
public :
unsigned deposit( unsigned amount )
{
balance += amount ;
return balance ;
}
unsigned int accountNumber ;
float balance ;
} ;
В приведённом примере помимо номера и баланса счёта в класс Savings добавлена функция deposit( ). Теперь класс Savings может самостоятельно управлять своим состоянием. Так же, как класс MicrowaveOven ( микроволновая печь ) содержит функцию cook( ) ( готовить ), класс Savings содержит функцию deposit( ). Функции, определённые в классе, называются функциями-членами.
Зачем нужны функции-члены...155
Почему мы должны возиться с функциями-членами? Что плохого в таком фрагменте:
class Savings
{
public :
unsigned accountNumber ;
float balance ;
} ;
unsigned deposit( Savings& s , unsigned amount )
{
s.balance += amount ;
return s.balance ;
}
Ещё раз напомню: пока что не обращайте внимания на символ "&" — его смысл станет понятен позже.
В этом фрагменте deposit( ) является функцией "вклада на счёт". Эта функция поддержки реализована в виде внешней функции, которая выполняет необходимые действия с экземпляром класса Savings. Конечно, такой подход имеет право на существование, но он нарушает наши правила объектно-ориентированного программирования.
Микроволновая печь имеет свои внутренние компоненты, которые "знают", как разморозить и приготовить продукты или сделать картошку хрустящей. Данные-члены класса схожи с элементами микроволновой печи, а функции-члены — с программами приготовления.
_________________
155 стр. Глава 13. Работа с классами
Когда я делаю закуску, я не должен начинать приготовление с подключения внутренних элементов микроволновой печи. И я хочу, чтобы мои классы работали так же, т.е. чтобы они без всякого внешнего вмешательства знали, как управлять своими "внутренними органами". Конечно, такие функции-члены класса Savings, как deposit( ), могут быть реализованы и в виде внешних функций. Можно даже расположить все функции, необходимые для работы со счетами, в одном месте файла. Микроволновую печь можно заставить работать, соединив необходимые провода внутри неё, но я не хочу, чтобы мои классы ( или моя микроволновая печь ) работали таким образом. Я хочу иметь класс Savings, который буду использовать в своей банковской программе, не задумываясь над тем, какова его рабочая "кухня".