Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Конструктори похідного класуСодержание книги
Поиск на нашем сайте
Це потенційна проблема програми 11.1. Що буде, якщо ми захочемо ініціалізувати значенням об’єкт класу CountOn? Чи зможемо ми скористатися конструктором базисного класу з одним аргументом? Відповідь буде заперечною. Для похідного класу слід написати власний конструктор. Зробимо це в програмі 11.2 #include <iostream.h> #include <conio.h> #include <bios.h> class Counter {protected: unsigned int count; public: Counter():count(0) //конструктор { } Counter (int c):count(с) { }
unsigned int get_count() {return count;}
Counter operator++ () {return Counter(++count); } };
class CountOn:public Counter //похідний клас {public: CountOn():Counter() { } CountOn(int c):Counter(с) { }
CountOn operator—() {return CountOn(--count); } }; //////////////////// int main() { clrscr(); CountOn c1; CountOn c2(100); cout <<”\nc1=”<<c1.get_count(); cout <<”\nc2=”<<c2.get_count(); ++c1;++c1;++c1; cout <<”\nc1=”<<c1.get_count(); --c2;--c2; cout <<”\nc1=”<<c1.get_count(); CountOn c3=--c2; cout<<”\nc3=”<<c3.get_count(); cout <<endl; bioskey(0); return 0; } Програма 11.2 Програма використовує два нові конструктори класу CountOn. Це конструктор без аргументів CountOn():Counter() { } і конструктор з одним аргументом CountOn(int c):Counter(с) { }
В першому конструкторі використана нова для нас можливість: ім’я функції після двокрапки. Вона використовується для виклику конструктора базового класу. Якщо ми запишемо в функції main()
CountOn c1; то компілятор створить об’єкт класу CountOn і викличе конструктор класу CountOn для його ініціалізації. Конструктор в свою чергу викличе конструктор базового класу, який виконає необхідні дії. Виклик конструктора в списку ініціалізації може бути зайвим, але має сенс. Ми хочемо проініціалізувати поле незалежно від того, чи належить воно базовому, чи похідному класу, і перед виконанням будь-якого оператора програми спершу виконаються операції конструктора. Конструктор CountOn(int c):Counter(с) { } з одним аргументом викликає відповідний конструктор з одним аргументом з базового класу.
Перезавантаження функцій Ми можемо визначити для похідного класу методи з такими ж іменами, як і в базового класу. В цьому випадку має місце перезавантаження функцій. Така можливість може знадобитися, якщо для об’єктів базового і похідного класу в нашій програмі використовуються однакові виклики. Проілюструємо це на такому прикладі. Одним з видів структур даних є стек, тобто такий набір даних, в якому останній доданий елемент видобувається першим. В формі стеків реалізується архітектура мікропроцесорів, функції передають аргументи і зберігають повернуті адреси у вигляді стеків. Далі приведена програма 11.3 моделює простий стек #include <iostream.h> #include <conio.h> #include <bios.h> class Stack {private: enum{MAX=10}; int st[MAX]; int top; public: Stack() {top=0;} void push(int var) {st[++top]=var;} int pop() {return st[top--];} };
//////////////////// int main() { clrscr(); Stack s1; s1.push(11); s1.push(22); cout<<”1: “<<s1.pop()<<endl; cout<<”2: “<<s1.pop()<<endl; s1.push(33); s1.push(44); s1.push(55); s1.push(66); cout<<”3: “<<s1.pop()<<endl; cout<<”4: “<<s1.pop()<<endl; cout<<”5: “<<s1.pop()<<endl; cout<<”6: “<<s1.pop()<<endl;
bioskey(0); return 0; } Програма 11.3 Ця програма має деякі недоліки: не відсікає спроб покласти в стек більше елементів, ніж він спроможний помістити або видобути зі стеку більше елементів, ніж там є. Для виправлення цих дефектів створимо новий клас Stack2, похідний від Stack. Об’єкти похідного класу поводяться як елементи базового, але попереджають про спроби переповнити стек або видобути елемент з порожнього стеку. Далі приведений лістінг програми 11.4 #include <iostream.h> #include <conio.h> #include <bios.h> #include<process.h> class Stack {protected: enum{MAX=10}; int st[MAX]; int top; public: Stack() {top=0;} void push(int var) {st[++top]=var;} int pop() {return st[top--];} }; ////////// class Stack2:public Stack {public:
void push(int var) {if (top>=MAX-1) {cout<<"Стек повний";exit(1); } Stack::push(var); }
int pop() { if (top<=0) {cout<<"\nСтек порожній\n"; bioskey(0);exit(1); }; return Stack::pop(); } }; //////////////////// int main() { clrscr(); Stack2 s1; s1.push(11); s1.push(22); s1.push(33); cout<<endl<<s1.pop(); cout<<endl<<s1.pop(); cout<<endl<<s1.pop(); cout<<endl<<s1.pop(); cout<<endl; bioskey(0); return 0; } Програма 11.4 В цій програмі клас Stack такий сам, як і в попередній, за винятком того, що дані класу оголошені як protected.
|
||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 38; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.239.111 (0.005 с.) |