Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Конструкторы

Как правило, удобнее инициализировать поля объекта автоматически в момент его создания, а не явно вызывать в программе соответствующий метод. Такой способ инициализации реализуется с помощью особого метода класса, называемого конструктором. Конструктор – это метод класса, предназначенный для инициализации объекта и выполняющийся автоматически в момент создания объекта. У конструкторов есть несколько особенностей. Во-первых, имя конструктора в точности совпадает с именем класса, что позволяет компилятору отличить конструктор от других методов класса. Во-вторых, у конструкторов не существует возвращаемого значения (даже типа void). Это объясняется тем, что конструктор автоматически вызывается системой, и, следовательно, не существует вызывающей программы или функции, которой конструктор мог бы возвратить значение.

Приведём пример, в котором вместо метода setdata() используется два конструктора (без аргументов и с аргументами).

class Tovar {

private:

enum { N = 30 }; // static const int N = 30;

char name[N];

int number;

float cena;

public:

Tovar() {

//name[0]='\0'; или strcpy(name,"\0"); number = 0; cena=0.;

cout << "\n Konstruktor 1" << endl;

}

Tovar(char* tname, int tnum, float tcen) {

strcpy(name, tname);

number = tnum;

cena = tcen;

cout << "\n Konstruktor 2" << endl;

}

void getdata() {

}

void showdata() {

}

};

int main() {

Tovar t1("Sanki der.", 1100, 231.45), t2;

t2.getdata();

//t2=t1; //такая операция допускается

t1.showdata(); t2.showdata();

getch(); return 0;

}

В данном примере, прослеживается такое явление, как перегрука конструкторов. Перегрузка уже встречалась нам при изучении функций. Компилятор определяет требуемый для запуска конструктор по числу и характеру (типу) аргументов. Для объекта t1 запускается конструктор 2, а для t2 – конструктор 1.

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

class Distance {

private:

int feet;

float inch;

public:

Distance(): feet(0), inch(0.0) // конструктор без аргументов

{ }

Distance(int ft, float in): feet(ft), inch(in) // конструктор с двумя аргументами

{ }

void getdist() { // ввод длины пользователем

cout << "\n Vvedite chislo futov: "; cin >> feet;

cout << " Vvedite chislo duymov: "; cin >> inch;

}

void showdist() { // вывод длины на экран

cout << feet << "'-" << inch << "''";

}

void add_dist(Distance a1, Distance a2); // прототип

};

//-----Определение методов класса вне класса (сложение длин)

void Distance::add_dist(Distance a1, Distance a2) {

inch = a1.inch + a2.inch; // Сложение дюймов

feet = 0; // с возможным за¸мом

if(inch >= 12.0) { // Если число дюймов больше 12.0, то

inch = inch - 12.0; // уменьшаем число дюймов на 12.0 и

feet++; // увеличиваем число футов на 1.

}

feet += a1.feet + a2.feet; // Сложение футов

}

//---------------------------------------------------------------------------

int main() {

Distance d1, d2(11, 6.25), d3; // определение и инициализация d2

d1.getdist(); // ввод значений для d1

d3.add_dist(d1, d2); // d3=d1+d2

cout << "\n d1 = "; d1.showdist();

cout << "\n d2 = "; d2.showdist();

cout << "\n d3 = "; d3.showdist();

getch(); return 0;

}

В этом примере приведён альтернативный синтаксис конструкторов, который аналогичен уже рассматривавшемуся ранее и более эффективному:

Distance() {

feet = 0; inch = 0;

}

Distance(int ft, float in) {

feet = ft;

inch = in;

}

Основной блок этой программы начинается с присвоения начальных значений полям объекта d2 класса Distance, после чего производится его сложение с экземпляром d1, инициализируемым пользователем. На экран выводится следующее:

Vvedite chislo futov: 11

Vvedite chislo duymov: 6.25

d1 = 11'-6.25"

d2 = 11'-6.25"

d3 = 23'-0.5"