Программирование с классами. Структурные компоненты класса. Перегрузка операций.


Классы, ф-ции-члены

Инкапсуляция – это слияние данных и ф-ций, работающими с этими данными, порождающее абстрактные типы данных.

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

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

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

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

struct date {

int month, day, year; // дата: месяц, день, год

void set(int, int, int);

void next();

void print();

// …

};

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

date today; // сегодня

date my_burthday; // мой день рождения

void f()

{

my_burthday.set(30,12,1950);

today.set(18,1,1985);

my_burthday.print();

today.next();

}

Поскольку разные структуры могут иметь функции члены с одинаковыми именами, при определении функции члена необходимо указывать имя структуры с использованием оператора “::” :

void date::next() {

if ( ++day > 28 ) {

// делает сложную часть работы

}

}

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

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

class date {

int month, day, year;

public:

void set(int, int, int);

void next();

void print();

};

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

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

Класс является типом, а не объектом данных и каждый объект класса имеет свою собственную копию данных членов класса. Некоторые типы реализуются более элегантно, если все объекты этого типа используют совместно некоторые данные. Например для управления задачами в ОС или для моделирования часто используется список всех задач.

Class Task{

//…

task *next;

static task * task _chain;

void shedule(int);

void wait(event);

//…

};

Использование членов класса static может значительно уменьшить потребность в глобальных переменных.

Инициализация статических данных членов класса.

К статическим членам класса Х можно обратиться как к обычным членам – по имени или по указателю на созданный объект с использованием стандартной мнемоники обращения к члену класса, так и по его полному имени, даже в том случае, если в прграмме не создан еще ни один объект класса Х.

Struct s {

Static sm;

//…

};

int s::sm=0;

void f(){

cout<<”s::sm=”<< s::sm<<endl;

cout<<”s.sm=”<< s.sm<<endl;//ошибка

s s;

cout<<”s.sm=”<< s.sm<<endl;

}

Загрузка...