- •25. Программный модуль
- •26Указатели в Паскале. Динамическая память на языке Паскаль
- •Ссылочные типы. Указатели в Паскале
- •Операции с указателями
- •Процедуры и функции для работы с указателями и адресами в Паскале
- •27. Динамические структуры данных | Связные списки
- •1 Связное представление данных в памяти
- •2 Связные линейные списки
- •2.1 Машинное представление связных линейных списков
- •2.2 Реализация операций над связными линейными списками
- •3. Нелинейные разветвленные списки
- •3.1 Основные понятия
- •3.2 Представление списковых структур в памяти.
- •3.3 Операции обработки списков
- •28. Стек и очередь
- •29. Системы программирования
- •30. Языки программирования
- •33. Накопители на гибких магнитных дисках
- •35Видеосистема персонального компьютера.
- •История
- •Технический обзор
- •Новые возможности по сравнению с Си
- •Не объектно-ориентированные возможности
- •Стандартная библиотека
- •Объектно-ориентированные особенности языка
- •Проблемы старого подхода
- •Инкапсуляция
- •Описание функций в теле класса
- •Конструкторы и деструкторы
- •Другие возможности функций-членов
- •Наследование
- •Полиморфизм
- •Будущее развитие
- •История названия
- •Пример №1
- •Пример №2
- •Пример №3
- •Пример №4
- •Описание и инициализация переменных
- •Int k; // это переменная целого типа int
- •Задание и использование констант
- •Описание и инициализация переменных
- •Int k; // это переменная целого типа int
- •Задание и использование констант
- •5.3.1. Символьные типы
- •5.3.2. Числовые типы
- •5.3.3. Типы дата/время
- •5.3.4. Двоичные типы
- •5.3.5. Пользовательские типы данных
- •2. [Проверка домашнего задания]
- •3. Актуализация знаний и умений учащихся по пройденному материалу
- •5. Реализация, составление алгоритмов с использованием повторения. Графика в программе Паскаль авс.
- •6. Ребус. Правильная осанка
- •9*. Тестирование
- •Операции над строками
- •Операции над строками
- •2. Объединения
- •Комбинированные типы. Записи
- •Обработка записей в Паскале
- •Оператор присоединения в Паскале
- •Вввод / вывод записей в Паскале
- •Примеры программ
Описание функций в теле класса
В теле класса можно указать только заголовок функции, а можно описать всю функцию. Во втором случае она считается встроенной (inline), например:
class Array {
public:
void Alloc(int _len)
{if (len==0) Free(); len=_len; val=new double[len];}
и так далее.
Конструкторы и деструкторы
Однако в приведённом примере не решена важная проблема: функции Alloc и Free по-прежнему надо вызывать вручную. Другая проблема данного примера — опасность оператора присваивания. Для решения этих проблем в язык были введены конструкторы и деструкторы. Конструктор вызывается каждый раз, когда создаётся объект данного типа; деструктор - при уничтожении. При преобразованиях типов, присваивании, передаче параметра тоже вызываются конструкторы и при необходимости деструкторы. С конструкторами и деструктором класс выглядит так:
class Array {
public:
Array() : len(0), val(NULL) {}
Array(int _len) : len(_len) {val = new double[_len];}
Array(const Array& a);
~Array() { Free(); }
inline double Elem(int i);
inline void ChangeElem(int i, double x);
protected:
void Alloc(int _len);
void Free();
int len;
double* val;
};
Array::Array(const Array& a) : len(a.len)
{
val = new double[len];
for (int i=0; i<len; i++)
val[i] = a.val[i];
}
Здесь Array::Array - конструктор, а Array::~Array - деструктор. Конструктор копирования (copy constructor) Array::Array(const Array&) вызывается при присваивании. Теперь объект класса Array нельзя испортить: как бы мы его ни создавали, что бы мы ни делали, его значение будет хорошим, потому что конструктор вызывается автоматически. Все опасные операции с указателями спрятаны в защищённые функции.
Array a(5); // вызывается Array::Array(int)
Array b; // вызывается Array::Array()
Array c(a); // вызывается Array::Array(const Array&)
Array d=a; // то же самое происходит вызов оператора =
b=c; // если он не определен (как в данном случае),
// то вызывается оператор присваивания по-умолчанию,
// который осуществляет побитовое копирование для базовых
// типов и вызов оператора присваивания для
// пользовательских как правило конструктор копий и
// оператор присваивания переопределяются попарно
Оператор new тоже вызывает конструкторы, а delete - деструкторы. По умолчанию, каждый класс имеет конструктор без параметров и деструктор. Конструктор без параметров по умолчанию вызывает конструкторы всех элементов, а деструктор - их деструкторы. Другие конструкторы по умолчанию не определены. Класс может иметь сколько угодно конструкторов (с разными наборами параметров), но только один деструктор (без параметров).
Другие возможности функций-членов
Функции-члены могут быть и операциями:
class Array {
...
inline double &operator[] (int n);
И далее
Array a(10);
...
double b = a[5];
Функции-члены (и только они) могут иметь описатель const
class Array {
...
inline double operator[] (int n) const;
Такие функции не имеют права изменять поля класса (кроме полей, определённых как mutable). Если они пытаются это сделать, компилятор должен выдать сообщение об ошибке.