Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет100/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   96   97   98   99   100   101   102   103   ...   256
Байланысты:
Бьерн Страуструп. Язык программирования С . М Бином, 2011

5.2.1 Функции-члены 
Посмотрим, как можно представить в языке понятие даты, используя для этого тип структуры и набор 
функций, работающих с переменными этого типа: 
struct date { int month, day, year; }; 
date 
today; 
void set_date(date*, int, int, int); 
void 
next_date(date*); 
void print_date(const date*); 
// 
... 
Никакой явной связи между функциями и структурой date нет. Ее можно установить, если описать 
функции как члены структуры: 
struct date { 
int month, day, year; 
void set(int, int, int); 
void get(int*, int* int*); 
void 
next(); 
void 
print(); 
}; 
Описанные таким образом функции называются функциями-членами. Их можно вызывать только через 
переменные соответствующего типа, используя стандартную запись обращения к члену структуры: 
date today; 
date my_birthday; 
void f() 

my_birthday.set(30,12,1950); 
today.set(18,1,1991); 
my_birthday.print(); 
today.next(); 

Поскольку разные структуры могут иметь функции-члены с одинаковыми именами, при определении 
функции-члена нужно указывать имя структуры: 
void date::next() 

if (++day > 28 ) { 
// здесь сложный вариант 


В теле функции-члена имена членов можно использовать без указания имени объекта. В таком случае 
имя относится к члену того объекта, для которого была вызвана функция. 
5.2.2 Классы 
Мы определили несколько функций для работы со структурой date, но из ее описания не следует, что 
это единственные функции, которые предоставляют доступ к объектам типа date. Можно установить 


Бьерн Страуструп.
Язык программирования С++ 
 
124 
такое ограничение, описав класс вместо структуры: 
class date { 
int month, day, year; 
public: 
void set(int, int, int); 
void get(int*, int*, int*); 
void 
next(); 
void 
print() 
}; 
Служебное слово public (общий) разбивает описание класса на две части. Имена, описанные в первой 
частной (private) части класса, могут использоваться только в функциях-членах. Вторая - общая часть - 
представляет собой интерфейс с объектами класса. Поэтому структура – это такой класс, в котором по 
определению все члены являются общими. Функции-члены класса определяются и используются точно 
так же, как было показано в предыдущем разделе: 
void date::print() 
// печать даты в принятом в США виде 

cout << month << '/' << day << '/' << year ; 

Однако от функций не членов частные члены класса date уже ограждены: 
void backdate() 

today.day--; // 
ошибка 

Есть ряд преимуществ в том, что доступ к структуре данных ограничен явно указанным списком 
функций. Любая ошибка в дате (например, December, 36, 1985) могла быть внесена только функцией-
членом, поэтому первая стадия отладки - локализация ошибки – происходит даже до первого пуска 
программы. Это только частный случай общего правила: любое изменение в поведении типа date может 
и должно вызываться изменениями в его членах. Другое преимущество в том, что потенциальному 
пользователю класса для работы с ним достаточно знать только определения функций-членов. 
Защита частных данных основывается только на ограничении использования имен членов класса. 
Поэтому ее можно обойти с помощью манипуляций с адресами или явных преобразований типа, но это 
уже можно считать мошенничеством. 


Достарыңызбен бөлісу:
1   ...   96   97   98   99   100   101   102   103   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет