Доступ: закрытый и открытый
Понятие структуры расширено в С ++, так что появилась возможность вводить закрытые и открытые члены данных функции-члены. Внутри структуры использование ключевого слова private с последующим двоеточием ограничивает доступ к членам, которые идут за этой конструкцией. Закрытые члены могут использоваться лишь некоторыми категориями функций. Таковыми являются функции-члены структур.
Изменим наш пример ch_stack , чтобы скрыть представление данных:
struct ch_stack {
public:
void reset ( ) {top = EMPTY; }
void push (char c) {top ++; s [top] = c; }
char pop ( ) { return s [top]; }
char top_of ( ) { return s [top]; }
bool empty ( ) { return (top = = EMPTY); }
bool full ( ) { return (top = = FULL); }
private:
enum {max_len= 100, EMPTY = -1, FULL = max_len -1};
char s [max_len];
int top;
};
Теперь перепишем функцию main ( ) из раздела 4.3, «Пример: стек» на стр. 112, чтобы проверить наши операции:
В файле ch_stac3.cpp
// обращение строки с использованием ch_stack
int main ( )
{
ch_stack s;
char str [40] = {“Меня зовут Дон Кнут!”};
int i = 0;
cout << str <<endl;
s. reset ( ); //s. top = EMPTY было бы ошибкой
while (str [i] && !s. full ( ))
s. push (str [i++] );
while (!s. empty ( ) ) //печать обращенной строки
cout << s. pop ( );
cout << endl;
}
Результат работы этой версии тестовой программы будет выглядеть так:
Меня зовут Дон Кнут!
! тунк ноД тувоз янеМ
Как указано в комментарии, доступ к скрытой переменной top ограничен. Она может быть изменена с помощью функции-члена reset ( ) , но к top нельзя обратиться напрямую. Отметьте также, как переменная s передается каждой функции-члену с использованием оператора выбора члены структуры.
Структура ch_stack имеет закрытую часть, содержащую описания данных, и открытую часть, содержащую функции-члены, необходимые для осуществления операций в ch_stack..
Классы
В С++ классы вводятся ключевым словом class. Они являются формой структуры, права доступа к членам которой по умолчанию определены как закрытые (private). Таким образом, struct и class взаимозаменяемы, но необходимо определять надлежащие права доступа.
Давайте перепишем пример с комплексными числами:
struct complex {
public:
void assign (double r, double i);
void print ( )
{ cout << real << “+” << imag << “i”;}
private:
double real, imag;
};
inline void complex : : assign (double r, double I = 0.0)
{
real = r;
imag = i;
}
А вот эквивалентное представление класса:
class complex {
public: //стиль «должен знать»,
void assign (double r, double i); //см. ниже
void print ( )
{ cout << real << “+” << imag << “i”;}
private:
double real, imag;
};
inline void complex : : assign (double r, double i = 0.0)
{
real = r;
imag = i;
}
Также возможно было бы:
class complex { //старый стиль, подразумевающий
double real, imag; // закрытый доступ
public:
void assign (double r, double i);
void print ( )
{ cout << real << “+” << imag << “i”;}
};
Здесь используется тот факт, что по умолчанию доступ к членам класса является закрытым.
