Библиотека классов

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1. КЛАССЫ И ЧЛЕНЫ

1.1. Функции-члены

1.2. Классы

1.3. Ссылка на себя\

1.4. Удаление

1.5. Подстановка

2. ИНТЕРФЕЙСЫ И РЕАЛИЗАЦИЯ

2.1. Альтернативные реализации

3. ДРУЗЬЯ КЛАССОВ

3.1. Вложенные классы

3.2. Статические члены

4. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ

4.1. Локальные переменные

4.2. Объекты класса как члены

5. СОЗДАНИЕ ПРОГРАММЫ

ВЫВОД

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ №1

\ПРИЛОЖЕНИЕ №2 ВВЕДЕНИЕ

Понятие класса, служит в С++ для того, чтобы дать программисту инструмент построения новых типов. Ими пользоваться не менее удобно, чем встроенными. В идеале использование определенного пользователем типа не должно отличаться от использования встроенных типов. Различия возможны только в способе построения.

Тип есть вполне конкретное представление некоторого понятия. Например, в С++ тип float с операциями +, -, * и т.д. является хотя и ограниченным, но конкретным представлением математического понятия вещественного числа. Новый тип создается для того, чтобы стать специальным и конкретным представлением понятия, которое не находит прямого и естественного отражения среди встроенных типов. Например, в программе из области телефонной связи можно ввести тип trunk_module (линия-связи), в видеоигре - тип explosion (взрыв), а в программе, обрабатывающей текст, - тип list_of_paragraphs (список-параграфов). Обычно проще понимать и изменять программу, в которой типы хорошо представляют используемые в задаче понятия. Удачно подобранное множество пользовательских типов делает программу более ясной. Оно позволяет транслятору обнаруживать недопустимое использование объектов, которое в противном случае останется не выявленным до отладки программы.

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

1. КЛАССЫ И ЧЛЕНЫ

Класс - это пользовательский тип. Этот раздел знакомит с основными средствами определения класса, создания его объектов, работы с такими объектами и, наконец, удаления этих объектов после использования.

1.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 ) {

// здесь сложный вариант

}

}

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

1.2. Классы

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

class date {

int month, day, year;

public:

void set(int, int, int);

void get(int*, int*, int*);

void next();

void print()

};

Общая часть - представляет собой интерфейс с объектами класса. Поэтому структура – это такой класс, в котором по определению все члены являются общими.

void date::print() // печать даты в принятом в США виде

{

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

}

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

void backdate()

{

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

}

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

1.3. Ссылка на себя

В функции-члене можно непосредственно использовать имена членов того объекта, для которого она была вызвана:

class X {

int m;

public:

int readm() { return m; }

};

void f(X aa, X bb)

{

int a = aa.readm();

int b = bb.readm();

// .

}

У функции-члена есть дополнительный скрытый параметр, являющийся указателем на объект, для которого вызывалась функция. Можно явно использовать этот скрытый параметр под именем this. Считается, что в каждой функции-члене класса X указатель this описан неявно как

X *const this;

и инициализируется, чтобы указывать на объект, для которого функция-член вызывалась. Этот указатель нельзя изменять, поскольку он постоянный (*const). Явно описать его тоже нельзя, т.к. this - это служебное слово. Можно дать эквивалентное описание класса X:

class X {

int m;

public:

int readm() { return this->m; }

};

Для обращения к членам использовать this излишне. В основном this используется в функциях-членах, непосредственно работающих с указателями.

Можно описать функцию-член таким образом, что объект, для которого она вызывается, будет доступен ей только по чтению. Тот факт, что функция не будет изменять объект, для которого она вызывается (т.е. this*), обозначается служебным словом const в конце списка параметров:

class X {

int m;

public:

readme() const { return m; }

writeme(int i) { m = i; }

};

Функцию-член со спецификацией const можно вызывать для постоянных объектов, а функцию-член без такой спецификации - нельзя:

void f(X& mutable, const X& constant)

{

mutable.readme(); // нормально

mutable.writeme(7); // нормально

constant.readme(); // нормально

constant.writeme(7); // ошибка

}

Тип указателя this в постоянной функции-члене класса X есть const X *const. Это значит, что без явного приведения с помощью this нельзя изменить значение объекта:


Страница: