Здавалка
Главная | Обратная связь

Основные отличия между описанием функции-члена и обычной функции.



· Имени функции-члена предшествует имя класса и оператор разрешения области видимости. Заголовок функции void TTime::Display(void) указывает компилятору, что Display() – член классаTTime.

Поскольку имя класса однозначно отождествляет имя функции-члена, в программе м.б. другие функции и функции-члены класса с именем Display(), не вызывающие конфликтов имен.

· Внутри функции-члена операторы имеют прямой доступ к членам класса. Например, в строках 32-33 непосредственно используются данные-члены класса TTimemonth, year, hour и minute.

 

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

Сначала в строке 16 объявляется appointment, как объект типа TTime. Объявления создает объект класса, так называемый экземпляр типа класса.

Класс TTime – всего лишь шаблон, схема, описывающая формат членов класса.

Вы должны создать объект типа класс, подобный appointment, для того, чтобы использовать класс.

Далее в строках 18-22 присваивают значения данным-членам appointment, инициализируются дата и время. Затем в строке 24, вызывается функция-член Display(), отображающая дату и время, хранящиеся в appointment.

Все эти строки используют оператор точки для доступа к членам объекта класса. Оператор точки следует использовать для ссылок на открытые данные-члены класса (которым предшествует спецификатор доступа public) аналогично ссылкам на члены структуры. Если таким членам является функции (см. строку 24), С++ вызывает функцию, которая обычно выполняет некоторые операции над данными-членами объекта класса. Например, в строке 24 вызывается функция Display() для отображения значения данных-членов appointment.

В программе также могут быть другие объекты класса Ttime, объявленные следующим образом:

TTime today;

TTime yesterday;

Этим объектам можно присвоить значения, и затем отобразить с помощью таких операторов:

today.Display();//отображения значения объекта класса today

yesterday.Display();

// отображения значения объекта класса yesterday

 

С++ позволяет структурам и объединениям иметь функции-члены, подобно классам. Действительно, если вы замените class на struct и удалите спецификатор доступа public, программа будет работать, как раньше. (Члены структура или объединения по умолчанию открыты для доступа). Конечно, на практике функции-члены очень редко используются в структурах и объединениях и обычно объявляются в классах.

 

В листинге 2.2 объявляется новая улучшенная версия класса TTime, которая использует функции-члены для доступа к данным-членам класса. Новый класс облегчает изменение структуры данных-членов класса, что позволяет выдержать сроки проекта.

Листинг 2.2. CLASS.CPP (новая улучшенная версия класса TTime)

1: #include <iostream.h>

2: #include <stdio.h>

3:

4: class Ttime {

//спецификатор доступа делает //закрытыми в классе данные-члены в //строках 6-10

5: private:

6: int year;

7: int month;

8: int day;

9: int hour;

10: int minute;

11: public:

// открытые функции-члены

12: void Display(void);

13: void GetTime(int &m, int &d,

int &y, int &hr, int &min);

14: void SetTime(int m, int d, int y, int hr, int min);

15: };

16:

17: main()

18: {

19: Ttime ap;

20: int month, day, year, hour, minute;

21:

22: ap.SetTime(7,14, 1996, 8, 30);

23: cout<< “ap == ”;

24: ap.Display();

25: ap.GetTime(month, day, year, hour, minute);

26: ap.SetTime(month, day, year, ++hour, minute);

27: cout<< “next hour == ”;

28: ap .Display();

29: return 0;

30: }

31:

32: void Ttime::Display(void)

33: {

34: char s[32];

35: sprintf(s,“Date:%02d/%02d/%04d Time: %02d:%02d\n”,

36: month, day, year, hour, minute);

37: cout<< s;

38: }

39:

// передаются значения компонентов //объекта класса обратно, в аргументы //оператора вызова, путем использования

// целочисленных ссылочных параметров

40: void Ttime::GetTime(int &m, int &d, int &y, int &hr, int &min)

41: {

// Возвращение

//данных-членов тому, кто вызвал функцию

42: m= month;

43: d=day;

44: y=year;

45: hr=hour;

46: min=minute;

47: }

48:

// значения параметров присваиваются //данным-членам класса

49: void Ttime::SetTime(int m, int d, int y, int hr, int mint)

50: {

// Присваивание аргументов данным-//членам

51: month=m;

52: day=d;

53: year=y;

54: hour=hr;

55: minute=min;

56: }

 

закрытые (private) члены класса доступны только членам этого класса и никому более, закрытые члены невидимы вне класса.

 

В классе могут присутствовать многочисленные открытые и закрытые секции, располагающиеся в произвольном порядке. Можно повторять спецификаторы доступа private и public в объявлении класса (строки 5 и 11) столько раз, сколько понадобится. Функции-члены также могут быть объявлены в закрытой части, но обычно они открыты.

Для использования закрытых данных-членов TTime существует лишь один законный способ - вызов открытых функций-членов класса. Непосредственный результат инкапсуляции данных и функций в классе: при изменении представления данных требуется переписать лишь функции-члены класса.

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

Рис. 2.2. Классы ограничивают доступ к закрытым членам

 

В основной программе, поскольку данные-члены TTime закрыты в классе, больше невозможно присваивать значения непосредственно объекту класса. Например, оператор из CLASS1.CPP

ap.month = 7; // ???

вызвал бы сообщение об ошибке при компиляции, т.к. month закрыт в классе TTime и поэтому может непосредственно использоваться только членами этого класса.

В новой программе для присваивания значений объекту класса appointment потребуется вызвать функцию-член. Например, в строке 22 выполняется оператор, который устанавливает дату и время в appointment равными 14 июля 1996 года, 8:30:

appointment.SetTime(7,14,1996,8,30);

Аналогично, в строке 25 вызывается функция GetTime() для копирования значений данных-членов appointment в локальные переменные, объявленные в строке 20. Эти значения затем передается обратно SetTime() с увеличенным за 1 значением hour, что устанавливается в appointment следующий час.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.