- •75Федеральное агенство по образованию
- •Лабораторный практикум
- •Часть 1. Теоретические сведения 5
- •Часть 2. Лабораторный практикум 63
- •Часть 1 Теоретические сведения
- •1 . Классы и объекты Объектно-ориентированный подход к программированию
- •Понятия класса и объекта
- •Доступ к членам класса
- •Функции встроенные и невстроенные
- •Статические переменные-члены класса
- •2. Конструкторы и деструкторы Конструкторы
- •Конструктор с инициализацией членов класса по умолчанию
- •Деструкторы
- •3. Перегрузка
- •Перегрузка функций
- •Перегрузка конструкторов
- •Перегрузка операторов
- •4. Производные классы и наследование
- •Объявление производного класса
- •Состав производного класса
- •Защищенные члены класса
- •Конструкторы и производные классы
- •5. Виртуальные функции Понятие виртуальной функции
- •Обслуживание множества объектов класса
- •Использование виртуальных функций
- •Абстрактные базовые классы
- •6. Потоки ввода-вывода
- •Базовые операции с файловыми потоками
- •Перегрузка операторов вставки и извлечения
- •7. Живучесть объектов Проблемы хранения объектов на диске
- •Библиотечный класса string
- •Конструкторы
- •Функции-члены
- •Перегруженные операторы
- •Живучие объекты
- •Часть 2 Лабораторный практикум р аботы лабораторного практикума Работа №1. Понятия класса и объекта (индивидуальное задание а)
- •Работа №2. Встроенные и невстроенные функции-члены
- •Работа №3. Конструкторы
- •Работа №4. Деструкторы
- •Работа №5. Конструктор с инициализацией по умолчанию
- •Работа №6. Статическая переменная в составе класса
- •Работа №7. Перегрузка функций
- •Работа №8. Перегрузка конструкторов (индивидуальное задание b)
- •Работа №9. Перегрузка операторов (индивидуальное задание c)
- •Работа №10. Базовые и производные классы
- •Работа №11. Виртуальные функции
- •Работа №12. Потоки ввода-вывода
- •Работа №13. Перегрузка в прикладном классе операторов вставки и извлечения
- •Работа №14. Библиотечный класс string
- •Работа №15. Создание живучих объектов и запись их на диск
- •Работа №16. Чтение с диска живучих объектов
- •Индивидуальные задания лабораторного практикума
Перегрузка конструкторов
Перегрузка конструкторов приобретает особое значение из-за того, что конструктору нельзя назначить произвольное имя – оно всегда должно совпадать с именем класса. В то же время в классе, как правило, приходится определять несколько конструкторов с разными сигнатурами. Наличие нескольких функций-конструкторов, имеющих одно имя, но разный состав параметров, возможно благодаря реализации в языке средства перегрузки функций.
Рассмотрим пример класса с перегруженными конструкторами. Пусть класс с именем Rect описывает прямоугольник, для которого можно задавать координаты (x и y) и длины сторон (w и h). Таким классом можно воспользоваться в приложении, формирующем на экране блок-схему программы или процесса. Координаты и размеры можно задавать парами целых чисел, однако в некоторых случаях может оказаться удобнее использовать структурные переменные типа POINT. Для реализации этой возможности в класс следует включить перегруженные конструкторы:
class Rect{
int x,y,w,h;//координаты и размеры
public:
Rect(int xx,int yy,int ww,int hh){//4 аргумента типа int
x=xx; y=yy; w=ww; h=hh;
}
Rect(POINT ptCoords,POINT ptDims){//2 аргумента типа POINT
x=ptCoords.x; y=ptCoords.y; w=ptDims.x; h=ptDims.y;
}
Rect(int xx,int yy){//Только координаты; размеры фиксированы
x=xx;y=yy;w=50;h=30;
}
};
Первый конструктор требует четыре целочисленных аргумента; при вызове второго конструктора необходимо указать две структурных переменных типа POINT; третий конструктор создает объект с задаваемыми координатами (в виде двух целых чисел), но с фиксированными размерами:
Rect r1(20,10,200,100);//x=20, y=10, w=200, h=100
POINT pc={250,50};
POINT pd={180,60};
Rect r2(pc,pd);//x=250, y=50, w=180, h=60
Rect r3(5,300);//x=5, y=300, w=50, h=30
Довольно часто встречается ситуация, когда при создании объекта неизвестны значения его данных и, соответственно, нельзя воспользоваться конструктором-инициализатором. Например, некоторый объект должен быть заполнен данными с диска; в этом случае необходимо сначала создать “пустой” объект, а затем прочитать в него значения данных, записанные на диске. В таких случаях в составе класса среди прочих конструкторов предусматривают перегруженный “конструктор по умолчанию”, который выделяет память под объект, но больше ничего не делает:
class Men{
char* name;
int age;
public:
Men(char*n,int a){name=n;age=a;}//Обычный конструктор-
//инициализатор
Men(){}//Конструктор по умолчанию, создающий “пустой” объект
void SetName(char*n) {name=n;}
void SetAge(int a) {age=a;}
};
Заметьте, что при наличии конструктора по умолчанию в классе должна быть предусмотрена возможность инициализировать данные уже после создания объекта. В приведенном выше примере для этого в класс включены функции SetName() и SetAge(). Теперь создавать объекты класса можно двояко:
Men m1(”Громыко”,25);//Объект создается и сразу же
//инициализируется конструктором-инициализатором
Men m2;//Пустой объект (создается конструктором по умолчанию)
m2.SetName(”Крымов”);//Инициализация пустого объекта
m2.SetAge(38);//вызовом соответствующих функций
Следует заметить, что реальные классы (как прикладные, так библиотечные) практически всегда содержат несколько, а иногда и много (до 10 – 15) перегруженных конструкторов.
