Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.DOC
Скачиваний:
14
Добавлен:
03.05.2019
Размер:
618.5 Кб
Скачать

Перегрузка конструкторов

Перегрузка конструкторов приобретает особое значение из-за того, что конструктору нельзя назначить произвольное имя – оно всегда должно совпадать с именем класса. В то же время в классе, как правило, приходится определять несколько конструкторов с разными сигнатурами. Наличие нескольких функций-конструкто­ров, имеющих одно имя, но разный состав параметров, возможно благодаря реализации в языке средства перегрузки функций.

Рассмотрим пример класса с перегруженными конструкторами. Пусть класс с именем 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) перегруженных конструкторов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]