
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Конструкторы производного класса
Если в данной программе нам понадобится инициализировать значением объект класса 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); } |