Классы, ф-ции-члены
Инкапсуляция – это слияние данных и ф-ций, работающими с этими данными, порождающее абстрактные типы данных.
Тип – это конкретное представление идеи (концепции). Причина проектирования нового типа заключается в том обеспечении конкр-го и заданного определения концепции, у кот-й нет прямого и очевидного аналога среди встроенных типов.
Программа, обеспечивающая типы, кот-е точно соответствуют концепции приложени, обычно легче для понимания и модификации, чем программа, кот-я этого не делает. Хорошо подобранное множество определенных пользователем типов делает программу более краткой, а компилятор может обнаруживать неверное использование объектов, кот-е в противном случае не было бы обнаружено до полного тестирования программы.
Функции-члены класса.
Рассмотрим реализацию понятия даты с использованием 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;
}
