Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 80
Текст из файла (страница 80)
nurns [ i ] ;return temp;1int array: :operator== (array ob2)_565Самоучитель C++566{int i ;for(i=0; i<10; i++) if(nums[i] != ob2.nums[i]) return 0,return 1;1int main!)i\array ol, o2, o3;int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };ol.set (i);o2.set (i);o3 - ol + o2;o3.show();o3 = ol — o3;o3. show() ;if(ol==o2) cout « "ol равно o2\n";else cout « "ol не равно о2\п";if(ol==оЗ} cout « "ol равно o3\n";else cout « "ol не равно оЗ\п";.return 0;5.
^include <iostream>using namespace std;class array {int nums[10];public:array () ;void set(int n[10]);void show();friend array operator-*-(array obi, array ob2);friend array operator-(array obi, array ob2);friend int operator==(array obi, array ob2);};array: :array {)int i;ПриложениеВ.Ответынавопросыирешенияупражнений_f o r ( i = 0; i < 10; i++) n u m s f i ] = 0;1void array : :set (int *n)tint i;f o r ( i = 0; i < 10; i++) nums[i] = n [ i ] ;Ivoid array: :show(){int i;f o r d = 0; i < 10; i++) cout « nums[i] « ' ';cout « "\n";Jarray operator+ (array obi, array ob2){int i;array temp;for(i=0; i<10; i++) temp.nums[i] = obl.nums[i] + ob2.nums[i];return temp;}array operator- (array obi, array ob2){int i;array temp;for(i=0; i<10; i++) temp.
nums [i] = obl.nums[i] — ob2 . nums [ i ] ;return temp;1int operator== (array obi, array ob2){int i;f o r ( i = 0 ; i<10; i++) if (obi .nums [i]return 1;}int main{){array ol, o2, o3;!= o b 2 . n u m s [ i ] J return 0;567568____int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };ol.set (i) ;o2.set (i) ;o3 - ol + o2;o3 . show ( } ;03 - ol - o3;o3 . show ( ) ;if (ol==o2) cout « "ol равно o2\n";else cout « "ol не равно о2\п";if{ol==o3) cout « "ol равно o3\n";else cout « "ol не равно оЗ\п";return 0;6. ttinclude <iostream>using namespace std;class array {int nums [10] ;public :array ( ) ;void set (int n[10]);void show() ;array operator++ () ;friend array operator — (array Sob) ;};array: : array (){int i;for(i = 0; i < 10; i++) nums[i] = 0void array: :set (int *n){int i;for(i - 0; i < 10; i++) nums[i] = n[i]}void array :: show ()fint i;СамоучительПриложениеВ,Ответынадопросыирешенияупражнений_569for (i = 0; i < 10; i++)cout « nums[i] « ' ';cout « "\n";// Перегрузка унарного оператора с использованием функции-членаarray array: :operator++ f)int i;for{i=0; i<10; i++) nums[i]++;return *this;// Перегрузка унарного оператора// с использоеанием дружественной функцииarray operator — (array &ob){int i;for{i=0; i<10; i+-f) ob.nums[i] — ;return ob;}int main(){array ol, o2, o3;int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };ol.set (i) ;o2.set(i) ;o3 = 4+o 1 ;o3.show() ;o3 = — ol;o3.
show{) ;return 0;7. Нет. Оператор присваивания может перегружаться только с использованиемфункции -члена.Самоучитель С++_570Упражнения7-11. Правильными являются инструкции А и С.2. Когда открытые члены базового класса наследуются как открытые, они становятся открытыми членами производного класса. Когда открытые членыбазового класса наследуются как закрытые, они становятся закрытыми членами производного класса.7.21. Когда защищенные члены базового класса наследуются как открытые, онистановятся защищенными членами производного класса. Когда защищенныечлены базового класса наследуются как закрытые, они становятся закрытымичленами производного класса.2. Категория защищенности позволяет сохранить закрытость определенныхчленов базового класса, оставляя, тем не менее, возможность доступа к нимиз производного класса.3. Нет.7.31.
^include <iostream>^include <cstring>using namespace std;class raybase {char str[aO];public:mybase(char *s) { strcpy(str, s)char *get() { return str; }class myderived: public mybase {int len;public:myderived{char *s}: mybase(s) {len = strlen(s);int getlenf) { return len; }void show() { cout « get() « '\n'; }};Приложение В. Ответы на вопросы и решения упражнений _int main (){myderived ob { "привет ");ob . show ( ) ;cout « ob.getlenf) « '\n';return 0;2. #include <iostream>:sing namespace st// Базовый класс для аь-о.мобилей разных типовclass vehicle {int num_wheels;int range ;public:vehicle {int w, int r)num_wheels = w; range = r;}void showv ( ){cout « "Число колес: " « num wheels « '\n'-—cout « "Грузоподъемность: " « range « ' \ n 'class car: public vehicle {int passengers;public:car (int p, int w, int r) : vehicle (w, r){passengers = p;}void show ( )(showv { ) ;cout « "Пассажироемкость : " « passengers « ' \n 'class truck: public vehicle (int loadlimit;public:truck(int 1, int w, int r) : vehicle (w, r)571572Самоучитель C++{loadlimit = 1;void show { )(showv ( ) ;cout « "Пробег: " « loadlimit « ' \n ' ;int main (){car c(5, 4, 500) ;truck t (30000, 12, 1200)cout « "Легковушка: \n";c.show() ;cout « "ХпГрузовик: \n";t .
show ( ) ;return 0;7.41. РаботаРаботаРаботаРаботаРаботаРаботаконструктора Аконструктора Вконструктора Сдеструктора Сдеструктора Вдеструктора А2. ^include <io5tream>using namespace std;class A {int i ;public:A (int a) { i - a; }class В {int j ;public:B{int a) { j = a; }Приложение В. Ответы на вопросы и решения упражнений573class С: public A, public В {int k;public:C{int с, int b, int a ) : A ( a ) , B ( b ) {k = c;7.52. Виртуальный базовый класс нужен тогда, когда производный класс наследуетдва (или более) класса, каждый из которых сам унаследовал один и тот жебазовый класс.
Без виртуального базового класса в последнем производномклассе существовало бы две (или более) копии общего базового класса. Однако благодаря тому, что исходный базовый класс делается виртуальным, впоследнем производном классе представлена только одна копия базового.Проверка усвоения материала главы 71. ttinclude <iostream>using namespace std;class building {protected;int floors;int rooms;double footage;class house: public building {int bedrooms;int bathrooms;public:house {int f, int r, double ft, int br, int bth)floors = f; rooms = r; footage = f t ;bedrooms = br; bathrooms = bth;}void show ( )cout «cout «cout «cout «cout «{"этажей:"комнат:"метраж:"спален:"ванн: "" « floors « ' \ n ' ;" « rooms « ' \ n ' ;" « footage « ' \ n ' ;" « bedrooms « ' \n ' ;« bathrooms « ' \ n ' ;{574________СамоучительC++class office: public building {int phones;int extinguishers;public :office (int f, int r, double ft, int p, int ext) (floors = f; rooms = r; footage = ft;phones = p; extinguishers = ext;}void showO (cout « "этажей: " « floors « '\n';cout « "комнат: " « rooms « '\n';cout « "метраж: " « footage « ' \n' ;cout « "телефонов: " « phones « '\n';cout «: "огнетушителей: " « extinguishers « '\n';int rnainOIhouse h_ob(2, 12, 5000, 6, 4);office o_ob(4, 25, 12000, 30, 8) ;cout « "Жилой дом: \п";h_ob .
show ( ) ;cout « "ХпОфис: \n";o_ob.show() ;return 0;2. Если базовый класс наследуется как открытый, открытые члены базовогокласса становятся открытыми членами производного класса, а закрытые члены базового класса остаются закрытыми. Если базовый класс наследуетсякак закрытый, все члены базового класса становятся закрытыми членамипроизводного.3. Члены, объявленные как защищенные (protected), являются закрытыми членами базового класса, но могут наследоваться (и к ним можно иметь доступ)любым производным классом. При наследовании со спецификатором доступа protected все открытые и защищенные члены базового класса становятсязащищенными членами производного класса.4.
Конструкторы вызываются в порядке наследования. Деструкторы — в обратном порядке.5. ^include <iostream>using namespace std;Приложение В. Ответь! на вопросы и решения упражнений__575class planet (protected:double distance; // расстояние в милях от Солнцаint revolve;// полный оборот в дняхpublic:planet (double d, int r) { distance = d; revolve = r; }class earth: public planet (double circumference; // окружность орбитыpublic :earth (double d, int r) : planet (d, r) {circumference = 2 * distance * 3.1416;}void show() (cout « "Расстояние от Солнца: " « distance « '\n';cout « "Полный оборот в днях : " « revolve « ' \n ' ;cout « "Окружность орбиты: " « circumference « '\n'int main(){earth ob (93000000, 365);ob .
show ( ) ;return 0;6. Для того чтобы программа стала верной, классы motorized и road_use должнынаследовать базовый класс vehicle как виртуальный.Проверка усвоения материала в целом1. Некоторые компиляторы не допускают использования инструкции switch вовстраиваемых функциях. Такие функции автоматически трактуются компилятором как "обычные" функции.2.
Оператор присваивания является единственным оператором, который не наследуется. Причину этого понять легко. Поскольку в производном классепоявятся члены, которых нет в базовом, то при перегрузке оператора = относительно базового класса в базовом классе ничего не будет известно о членах, появившихся в производном классе, и поэтому невозможно правильнокопировать эти новые члены.5/6Самоучитель_ГЛАВА 8Повторение пройденного1. ^include <iostrearn>using namespace std;class airship {,protected:int passegers;double cargo;•class airplane: public airship {char engine; // p для винтового, j для реактивногоdouble range;public:airplane (int p, double c, char e, double r}{passegers = p;cargo = c;engine = e;range = r;}void show ( ) ;11class balloon: public airship {char gas; // h для водорода, е для гелияdouble altitude;public:-balloon (int p, double c, char g, double a)ipassegers = p;cargo = c;gas = g;altitude = a;}void show f ) ;void airplane: : show (){cout « "Пассажировместимость : " « passegers « '\n';cout « "Грузоподъемность : " « cargo « ' \n' ;cout « "Двигатель: ";C++Приложение В, Ответы на вопросы и решения упражненийif (engine=='p' ) cout « "Винтовой\п";else cout « "Реактивный\п";cout « "Дальность: " « range « '\n';void balloon: : show (){cout « "Пассажире вместимость : " « passegers « '\n'cout « "Грузоподъемность: " « cargo « '\n';cout « "Наполнитель : " ;if(gas=='hM cout « "Водород\п";else cout « "Гелий\п";cout « "Потолок: " « altitude « '\n';}int.
ma in (){balloon Ь (2, 500.0, 'h1, 12000.0);airplane b727 (100, 40000.0, 'j', 40000.0);b. s h o w ( ) ;cout « ' \ n ' ;b727.show() ;return 0;2. Спецификатор доступа protected оставляет члены базового класса закрытыми,но при этом позволяет получить к ним доступ из любого производного класса.3. Выводимый на экран результат работы программы иллюстрирует очередностьвызова конструкторов и деструкторов.РаботаРаботаРаботаРаботаРаботаРаботаконструктора Аконструктора Вконструктора Сдеструктора Сдеструктора Вдеструктора А4. Порядок вызова конструкторов — ABC, порядок вызова деструкторов — СВА.5. #include <iostream>using namespace std;class base {int i, j;public:base (int к, int y) {i = x; j = y; }575_-^_____СамоучительC++void showij (} { cout « i « ' ' « j « '\n'; }class derived: public base {int k;public :derived(int a, int b, int c) : base(b, c) (k = a;}void showO { cout « k « ' '; showij {); }hint main{){derived ob(l, 2, 3) ;ob.