Class cot
Имя объекта. имя компонента
Void main ()
Turbo Pascal, 60.0
Язык С++, 62.0
Уничтожение экземпляра: Язык С++
Уничтожение экземпляра: Turbo Pascal
2. … class stroka {
char*ch // указатель на строку на символьный массив
int len // длина строки
public:
stroka(char*cch) // конструктор1
{ len = strlen(cch); ch=new char [len+1];
strcpy (ch,cch); };
stroka(int N=20) // конструктор 2
{ ch= new char[N+1}; len=0; ch[0]=’\0’}
int len_str(void) { return len;} // возвращает длину
//строки
char * string (void) {return ch;} // возвращает указатель на строку
void vivod () // выводит данные
{ cout<< “строка: “ <<ch <<”, длина строки=”<<len;};
~stroka() // деструктор
{ delete []ch;};
}
{ stroka S1(“Миру-мир”);
S1.vivod;}
Деструктор автоматически освободит память.
Деструктор идеальное место для всей общей работы по очистке, напр.: освобождение памяти, сохранение данных в файлах, закрытие файлов…
Компонентные данные
1) При обращении к данным из компонентных функций используется только
имя компонента
2) При обращении к компонентам из операторов, выполняемых вне класса
(если позволяет статус доступа)
указатель на объект -> имя компонента
3) Данные класса (а также компонентные функции) не обязательно должны быть описаны до первого обращения к ним в классе. Т.е. все компоненты класса видны во всех операторах его тела.
В связи с этим отличием введена особая область видимости – класс (наряду с файлом, блоком и функцией).
4) Каждый объект класса имеет свою копию данных класса, кроме статических данных. Статический компонент (static) не тиражируется, существует в единственном экземпляре
Статические компоненты класса необходимо описывать и инициировать
вне определения класса как глобальные переменные.
Обращаться к ним можно до определения первого объекта класса с помощью квалифицированного имени:
имя класса::имя компонента
Если объекты объявлены, то к статическому компоненту можно
обращаться стандартно, и всякое изменение статического компонента в одном объекте становится видно во всех объектах.
Если статический элемент имеет статус private или protected к нему можно обращаться только из компонентных функций. Если надо обратиться до определения объектов, надо ввести статическую компонентную функцию, со спецификатором static, которую можно вызывать до определения объектов с помощью квалифицированного имени:
имя класса::имя статической функции (параметры)
Пример:
{ …;
static int N; // статический компонент
public: …
static void count(int value) { N = value};
};
int cot::N=0; // внешняя инициализация статического элемента
{ cot::count(500); …
//изменение статического компонента до объявления объектов
}
5) Указатели на компоненты класса
Определение указателя на компонентные данные класса:
тип данных(имя класса::*имя указателя)
В определение можно включить и инициализацию
& имя класса:: имя компонента
int (stroka::*plen)=&stroka::len;
// - не верно, т.к. len – имеет статус private
При инициализации надо использовать общедоступные компоненты.
После объявления объекта к его компонентам следующий формат обращения через указатель:
имя объекта.* указатель на компонент данных;
Если определен указатель на объект формат обращения:
Указатель на объект-> *указатель на компонент данных;
Определение указателей на компонентные функции
Тип возвращаемого результата (имя класса::*имя указателя на метод)
(спецификация параметров функции);
void (book::*fprt)(void) = & book::show_book;
// определение указателя на компонентные функции класса book и
// инициализация указателя компонентной функцией show_book
И форматы обращения к методам через указатели:
Имя объекта.*указатель на метод(параметры);
Указатель на объект-> *указатель на метод (параметры);
Пример:
book A (“C и C++”, “Б.И.Березин», 40.0); // определен объект
void (book::*fprt)(void) = & book::show_book;
(A.*fptr) () // выведет на печать значения объекта
Если в определении класса было бы несколько идентичных функций указатель fptr можно “настроить” на другие функции