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

Конструкторы производного класса

Если в данной программе нам понадобится инициализировать значением объект класса CountPr (например с2=--с1; с2=++с1;), то компилятор не позволит использовать конструктор базового класса с одним аргументом, потому что в нём возвращаемым типом данных является тип Count. В связи с этим, мы должны написать новый конструктор для производного класса.

class Count { //базовый класс

};

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

class CountPr : public Count { // производный класс

public:

CountPr() { c = 0; }

CountPr(int d) { c = d; }

CountPr operator--() {

--c;

return CountPr(c);

}

};

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

int main( ) {

CountPr c1, c2; // объект с1 производного класса

cout << "\n c1=" << c1.get(); //увидим c1=0

++c1; ++c1; ++c1;

cout << "\n c1=" << c1.get(); //увидим c1=3

c2=c1;

c2=--c1;

cout << "\n c2=" << c2.get(); //увидим c2=2

getch(); return 0;

}

Существует также альтернативный вариант записи конструктора производного класса:

class CountPr : public Count { // производный класс

public:

CountPr() : Count() { }

CountPr(int d) : Count(d) { }

CountPr operator--() {

--c;

return CountPr(c);

}

};

Здесь использован новый вид записи конструктора производного класса. Конструктор CountPr( ) : Count( ) вызывает конструктор базового класса Counter, который и выполняет нужные действия.

Когда инициализируется значением объект с2 (с2=--с1;), то при этом вызывается конструктор с одним аргументом класса CountPr, который вызывает соответствующий конструктор с одним аргументом из базового класса. Конструкция CountPr(int d) : Count (d) означает, что аргумент "d" будет передан от конструктора CountPr() в Count( ), где будет использован для инициализации объекта.

Вопрос

Как надо изменить производный класс, чтобы появилась возможность использовать постфиксную операцию инкрементирования.

Ответ

class Count {

};

class CountPr : public Count {

public:

CountPr() { c = 0; }

CountPr(int d) { c = d; } // или CountPr(int d) : Count(d) { }

CountPr operator--() {

--c;

return CountPr(c);

}

CountPr operator++() {

Count::operator++();

}

CountPr operator++(int) {

c++;

return c;

}

};

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

int main( ) {

CountPr c1, c2;

cout << "\n c1=" << c1.get();

++c1; ++c1; ++c1;

cout << "\n c1=" << c1.get();

c2=++c1;

c2=c1++;

cout << "\n c2=" << c2.get();

getch(); return 0;

}

Вопрос

Какой метод надо добавить в производный класс, чтобы в главной функции, появилась возможность использовать оператор c3 = c2 * c1; или c3 = CountPr(10) * c1 ?

Ответ

CountPr operator*(CountPr a) {

return CountPr(c*a.c);

}