Объектно-ориентированное программирование — Определение первичного класса

Определение первичного класса

Мы определили класс как тип данных, состоящий из полей (типов данных) и составных функций. Слияние данных и функций, работающих с этими данными, называется инкапсуляцией. Таким образом

класс = данные + составные функции.

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

Наследование реализовано с помощью понятия производного класса. Класс называется производным от другого класса, если он содержит все поля и функции этого другого класса. Если класс не является производным, то он называется первичным. В предшествующем параграфе фактически было дано определение первичного класса. Тело класса разбито на три части, соответствующие трем атрибутам

class имя

{

private:

protected:

public:

};

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

Атрибут protected имеют члены класса, доступные для составных и дружественных функций классов, которые являются производными от этого класса или совпадают с ним. Эти члены класса называются защищенными.

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

Если первичный класс объявлен с ключевым словом class, то первые его члены будут закрытыми по умолчанию, если как struct, то открытыми.

В случае union члены класса могут быть только открытыми. Например, если класс объявлен как

class Vector

{

double x,y;

public:

double getx() {return x;}

double gety() {return y;}

};

то элементы класса x и y будут закрыты по умолчанию, и обращение к ним, как к открытым членам, приведет к ошибке. Эти элементы можно будет читать с помощью функции getx() и gety():

void main()

{

Vector a;

int z;

z=a.x; //ошибка!

z=a.getx(); //верно

}

Произвольная внешняя функция, прототип которой объявлен в теле класса и имеет модификатор friend, называется дружественной функцией этого класса.

Составные функции, определяемые внутри тела класса, будут подставляемыми (inline). Составные функции, определенные как внешние, с помощью оператора разрешения области видимости “::”, тоже можно сделать подставляемыми, указав для них модификатор inline. Но такое определение необходимо поместить перед первым использованием этой функции.

Пример. Определим класс, объектом которого является стек целых чисел. Для инициализации стека определим дружественную функцию. Для записи элемента в стек и для чтения элемента из стека определим функции Push() и Pop().

#include

#include

// Описание класса — целочисленный стек

class IntStack

{

// Закрытые элементы

int *v; // У нас стек будет реализован в виде массива

int size, top; // Размер стека и положение вершины

public: // Общедоступные элементы

friend IntStack init(int size); //Дружественная функция //инициализации стека

int pop(); // Извлечение числа из вершины стека

void push(int x); // Занесение числа в стек

};

// Инициализации стека

IntStack init(int size)

{

IntStack res; // Создаём новый стек

res.v=new int [size]; // Выделяем память под массив

res.size=size; // Указываем размер стека

res.top=size; // Устанавливаем вершину стека

return res; // Возвращаем созданный стек

}

// Занесение числа в стек

inline void IntStack::push(int x)

{

if(top>0) v[--top]=x;

}

// Извлечение числа из стека

inline int IntStack::pop()

{

if(top

else return 0;

}

void main()

{

clrscr(); // Очистка экрана

IntStack s1, s2; // Создание стеков

s1=init(10); s2=init(20); // Инициализация стеков

cout<<"Заносим в стек s1 число -3\n";

s1.push(-3);

cout<<"Заносим в стек s2 число 1\n";

s2.push(1);

cout<<"Заносим в стек s1 число -2\n\n";

s1.push(-2);

cout<<"Извлекаем из стека s1 первое число "<

cout<<", затем второе "<

cout<<"Извлекаем из стека s2 число "<

getch(); // Ожидание нажатия клавиши

}

Результаты работы программы

Заносим в стек s1 число -3

Заносим в стек s2 число 1

Заносим в стек s1 число -2

Извлекаем из стека s1 первое число -2, затем второе -3

Извлекаем из стека s2 число 1

Если функцию Pop() или функцию Push() определить за текстом главной программы, то модификатор inline приведет к ошибке, ибо компилятор при генерации кода главной программы использовал команды call, и при встрече модификатора inline не может эти команды заменить на подставляемые функции.

Вы здесь: Главная Информатика Программирование Объектно-ориентированное программирование