Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех экземпляров класса. Статические поля создаются при их инициализации и существуют все время работы программы. Если объекты не созданы, то статические поля можно изменять только с помощью статических методов. Обращение к статическим полям производится с указанием имени класса или имени объекта, если объекты созданы.
Пример использования статических полей class student {… static int count; public: student (char *f, char *n, int a = 20) : age (a) { fam = new char [20]; name = new char [20]; strcpy (fam, f); strcpy (name, n); count++; } … void showcount() { cout
Константные методы и объекты Константные методы определены со словом const и не могут изменять поля объекта. Константные объекты недоступны для изменения. Для таких объектов можно использовать только константные методы.
Пример использования константных методов class student { … void show () const { cout
Дружественные функции и классы Дружественные функции могут получить доступ к скрытым элементам класса. Дружественная функция объявляется внутри класса с ключевым словом friend. Дружественная функция может быть либо обычной функцией, либо методом другого ранее определенного класса. Одна функция может быть дружественной для нескольких классов. Класс может быть описан как дружественный внутри другого класса. Все методы дружественного класса могут получить доступ к скрытым элементам класса.
Пример использования дружественных функций class _time { int h,m; public: _time ( int hours = 0, int minutes = 0) { h = hours; m = minutes; } friend void settime( _time &t, int hr, int mn) { t.h = hr; t.m = mn; } void show() { cout
С++ позволяет переопределить операции так, чтобы они работали с экземплярами классов. Перегрузить можно все операции кроме. ?: :: sizeof При перегрузке сохраняются количество аргументов, приоритеты операций и правила ассоциаций. Перегрузка производится с помощью специальных функций-операций: operator Функции-операции не наследуются и не могут быть статическими.Функция-операция может быть дружественной функцией либо методом класса. Перегрузка операций
Пример перегрузки операций class _time {… friend _time operator+ (_time time1, _time time2) { int h = time1.h + time2.h; int m = time1.m + time2.m; if (m>60) { h++; m-=60; } h = h % 24; return _time(h,m); } _time & operator ++ () { ++m; if (m == 60) { ++h; m=0; } h = h % 24; return *this; } _time operator ++ (int) { _time t = *this; ++m; if (m == 60) { ++h; m=0; } h = h % 24; return t; } }; int main() { _time t(12,30), p (14, 35), r; r = t + p; p = ++r; t = r++; r.show(); p.show(); t.show(); return 0;}
Перегрузка присваивания T& operator = (const T&) Пример: _time & operator =(const _time & t) { h = t.h; m = t.m; return *this; }
Перегрузка индексирования class vector {int size; int *p; public: vector ( int n = 10) : size(n) { p = new int [size]; } ~vector () { delete [] p; } int& operator [] (int i) { if (i size) { cout
Перегрузка приведения типов Операция не имеет возвращаемого значения и параметров. operator имя_типа() class _time { … operator int() {return h*60+m;} … } int main() { _time t (15,20); cout
Функциональные классы(функторы) В функциональном классе переопределена операция вызова функции (). class maximum { public: int operator () (int a, int b) { return a>b ? a : b; } }; int main() {cout