Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
81
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

14.2 Инкапсуляция

Инкапсуляция в объектно-ориентированном программировании — это сокрытие деталей реализации. Спецификации доступа public, protected и private регулируют видимость компонент извне. Вот как они применяются:

class date {

private:

int d, m, y;

public:

void set (int,int,int);

...

};

По умолчанию все компоненты class описаны как private (недоступные извне), а все компоненты struct и union — как public (общедоступные).

14.3 Конструктор

Конструктор — это функция, специально предназначенная для инициализации объекта. Конструктор носит то же имя, что и класс. Класс может иметь несколько конструкторов.

class date {

int d,m,y;

public:

date(int,int,int); // создает дату из аргументов

date(char*); // создает дату из строки

date() {}; // пустой конструктор

...

};

Примеры инициализации объектов:

void main ( ){

date d1 = date (10,20,30);

date d2(1,2,3); // сокращенная форма инициализации

date d3 = d2; // инициализация присваиванием

date d4; // инициализация пустым конструктором

date d5 = date(d4); // инициализация конструктором

// копирования

}

Если программист не определил конструктор, транслятор сам строит пустой конструктор без параметров. То же касается конструкторов присваивания и копирования.

З а м е ч а н и е. При наличии других конструкторов пустой конструктор требует явного определения.

Конструктор не возвращает значения, не наследуется, не может быть объявлен как const, virtual, volatile или static.

14.4 Деструктор

Деструктор решает задачу, обратную задаче конструктора. Он вызывается всякий раз, когда объект уничтожается. Имя деструктора состоит из знака “~” и имени класса. Например, ~date() .

Деструктор не имеет аргументов, не возвращает значения, не наследуется, не может быть объявлен как const, volatile или static. Деструктор может быть объявлен как virtual.

Компилятор сам генерирует деструктор, если программист его не определяет. Когда объект выходит из области видимости, деструктор вызывается автоматически.

14.5 Пример класса — список в динамической памяти

#include <alloc.h>

class list {

void *info;

list *next;

public:

list (void*);

list ();

~list ();

void add (void*);

};

Данный класс реализует рекурсивную структуру данных. Рекурсивность его в том что список рассматривается как указатель на некоторую информацию в динамической памяти (поле info) и указатель на список же, только более короткий (поле next) . В частном случае одноэлементного списка этот указатель равен NULL.

list::list () {info = 0; next = 0;}

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

list::list (void* p) : info (p), next (0) {}

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

list::~list () {

delete info;

delete next;

}

Это деструктор, который освобождает всю динамическую память, занимаемую списком. Деструктор рекурсивный, так как оператор delete next; автоматически вызовет деструктор класса для списка, на который указывает next и т.д., пока не настанет момент, когда в очередном поле next не окажется NULL. В этом случае операция delete закончится неудачей, и деструктор вызван не будет.

void list::add(void* p) {

list *l = new list (p);

l->next = next;

next = l;

}

Этот метод добавляет один элемент в список. Сначала оператор

list *l = new list (p);

создает список из одного элемента, а затем пара операторов

l->next = next;

next = l;

“встраивают” этот элемент сразу за головным элементом списка.

void main (){

list *L = new list("123456789");

int *q = new int, *q = 10;

L->add (q);

delete L;

}

Главная программа демонстрирует создание одноэлементного списка,

list *L = new list (“123456789”);

добавление к нему второго элемента

int *q = new int, *q = 10;

L->add (q);

и удаление списка из памяти

delete L;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]