Доступ: закрытый и открытый
Понятие структуры расширено в С ++, так что появилась возможность вводить закрытые и открытые члены данных функции-члены. Внутри структуры использование ключевого слова 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];
inttop;
};
Теперь перепишем функцию main( ) из раздела 4.3, «Пример: стек» на стр. 112, чтобы проверить наши операции:
В файле ch_stac3.cpp
//обращение строки с использованием ch_stack
int main ( )
{
ch_stack s;
charstr [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;
}
Также возможно было бы:
classcomplex{ //старый стиль, подразумевающий
double real, imag; //закрытый доступ
public:
void assign (double r, double i);
void print ( )
{ cout << real << “+” << imag << “i”;}
};
Здесь используется тот факт, что по умолчанию доступ к членам класса является закрытым.