Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры / ООП(Тимофеев) / ООП-Тимофеев.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
328.19 Кб
Скачать

Функции-члены класса

Концепция struct расширена в С ++ так, что функции могут быть членами структур. Объявление функции включается в объявление структуры и эта функция вызывается с использованием методов доступа, которые определены для членов структуры.

struct ch­_stack { // представление данных int top;

enum {max_len = 100, EMPTY = -1, FULL = max_len -1}; char s [max_len];

//операции, представленные как функции-члены

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) ;}

};

Функции-члены (member function) записаны подобно обычным функциям. Единственное отличие состоит в том, что они могут использовать имена членов класса « как есть ». Так, функции-члены ch­_stack используют переменные top и s без явного указания имени структуры. При вызове функций-членов применительно к конкретному объекту типа ch­_stack они действуют на указанные члены данных именно этого объекта.

Функции-члены, которые определены внутри struct, являются неявно встраиваемыми. Как правило, только короткие, интенсивно используемые функции-члены должны определяться внутри struct, как в только что приведенном примере. Чтобы определить функцию-член вне struct, используется оператор разрешения области видимости (scope resolution) . используя оператор разрешения области видимости. В этом случае функция уже не будет неявно встраиваемой.

struct ch­_stack { // предоставление данных int top;

enum {max_len = 100, EMPTY = -1, FULL = max_len -1}; char s [max_len];

// операции, представленные как функции-члены

void reset ( ) {top = EMPTY; } //неявно встроенная функция

void push (char c) ; //прототип функции

….. };

void ch_stack : : push (char c)//определение невстроенной функции

{ top ++; s [top] = c; }

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

struct ch_stack {….. char pop (int n); // в пределах ch_stack

….. }; char ch_stack : : pop (int n)

{ while (n-- > 1) top--; return s [top--] }

Что конкретно будет вызвано, зависит от текущих аргументов функции pop:data. pop ( ); // вызывает стандартный рор data. pop (5); // вызывает многократный рор

Доступ: закрытый и открытый

Понятие структуры расширено в С ++, так что появилась возможность вводить закрытые и открытые члены данных функции-члены. Внутри структуры использование ключевого слова private с последующим двоеточием ограничивает доступ к членам, которые идут за этой конструкцией. Закрытые члены могут использоваться лишь некоторыми категориями функций. Таковыми являются функции-члены структур. 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; };

Как указано в комментарии, доступ к скрытой переменной 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; }

Здесь используется тот факт, что по умолчанию доступ к членам класса является закрытым.

Соседние файлы в папке ООП(Тимофеев)