Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 34
Текст из файла (страница 34)
Он долженпередавать классу planet расстояние и число оборотов,а также рассчитывать окружность орбиты {Подсказка:окружность = 2г * 3.1416.)V/* Создайте функцию show() для вывода информации на экран */int main ()гearth оЬОЗОООООО, 365);ob.show( ) ;return 0;6.
Исправьте следующую программу:/* Вариация иерархии классов из примера с классом vehicle. Впрограмме имеется ошибка. Найдите ее. Подсказка: попытайтесьпровести компиляции и изучите сообщения об ошибках */^include <iostream>using namespace std;// Базовый класс для автомобилей разных типовClass vehicle {int num_wheels;int range;public:vehicle(int w, int r}num wheels = w; range = r;234________Самоучитель C++void showvO{cout « "Число колес" « nuin_wheels « ' \ n ' ;rcout « "Грузоподъемность" « range « \ n ' ;enum motor {gas, electric, diesel};class motorized: public vehicle {enum motor mtr;public:motorized {enum motor m, int w, int r) : vehicle (w, r){mtr = m;}void showmO {cout « "Мотор:";switch (mtr) {case gas: cout « "На газе\п";break;case electric: cout « "На электроэнергии\п";break;case diesel: cout « "ДизельныйХп";break;class road_use: public vehicle {int passengers;public:road__use (int p, int w, int r} : vehicle(w, r)tpassengers - p;1void showr()(cout « "Пассажироемкость" « passengers « '\n';enum steering {power, rack_pinion, manual};class car: public motorized, public road_use {enum steering strng;public:car(enum steering s, enum motor m, int w, int r, int p}:Глава 7, Наследование235road_use(p, w, r ) , motorized(m, w, r), vehicle(w, r){strng = s;void show() {s h o w v f ) ; showr(); showm();cout « "Управление:";switch(strng) (case power: cout « "Силовой привод\п";break;case rack_pinion: cout « "Механический привод\п";break;case manual: cout « "Ручной приводХп";break;I};int main()car c(power, gas,4,500,5);с.show();return 0;}Проверка усвоенияматериала в целомВ этом разделе проверяется, хорошо ли вы усвоили материал этой и предыдущих глав.1.
При компиляции программы из вопроса 6 только что приведенных упражнений по проверке усвоения материала главы 7, вы могли увидетьпредупреждающее сообщение (или, возможно, сообщение об ошибке),связанное с использованием инструкции switch внутри классов саг иmotorised.
Почему?2. Как вы знаете из предыдущей главы, большинство операторов, перегруженных в базовом классе, доступны для использования в производном.Для какого или для каких операторов это не так? Объясните, почему.3. Следующей представлена переработанная версия класса coord из предыдущей главы. Теперь он используется в качестве базового для класса236__Самоучитель C++quad, в котором помимо координат хранится номер квадранта, к которому принадлежит точка с этими координатами.
Запустите программу ипопытайтесь понять полученный результат./* Перегрузите операторы +, — и = относительно класса coord. Затемиспользуйте класс coord в качестве базового для класса quad */^include <iostream>using namespace std;class coord {public:int x, у; // значения координатcoord {) { x = 0; у- 0; }coord { int i, int j) { x = i; у = j; }void get_xy(int fii, int fij) { i = x; j = y; }coord operator+ (coord ob2);coord operator- {coord ob2);coord operator=( coord ob2};// Перегрузка оператора + для класса coordcoord coord: :operator+ (coord ob2){coord temp;cout « "Использование функции operator+ {) \n";temp . x = x + ob2 . x ;temp. у = у + ob2.y;return temp;// Перегрузка оператора — относительно класса coordcoord coord: : operator- (coord ob2){coord temp;cout « "Использование функции operator- () \n";temp.x = x — ob2.x;temp.
у = у — ob2.y;return temp;// Перегрузка оператора = относительно класса coordcoord coord: :operator= (coord ob2)Глава 7. Наследование237{cout « "Использование функции operator^ ()\п";х = оЬ2.х;у = оЬ2 . у;1return *this; // возвращение присваиваемого объектаclass quad: public coord {int quadrant;public:quad() { x = 0; у = 0; quadrant =0; }quad(int x; int y): coord(x, y)if(x>=0 && y>=0) quadrant = 1;else if(x<0 && y>=0) quadrant = 2;else if(x<0 && y<0} quadrant = 3;else quadrant = 4;void showq()cout « "Точка в квадранте: " « quadrant « '\n';quad operator=(coord ob2);•quad quad::operator=(coord ob2)cout « "Использование функции operator=()\n";x = ob2,x;у = ob2.у;if(x>=0 && y>=0} quadrant = 1;else if(x<0 && y>=0) quadrant = 2;else if(x<0 Sfi y<0) quadrant = 3;else quadrant = 4;return *this;int main()quad ol(10, 10), o2(15, 3), o3;int x, y;o3 = ol 4 o2; // сложение двух объектов// вызов функции operator-f()o3.get_xy(x, y);o3.showq();cout « "(ol + o2) X: " « x « ", Y: " « у « "\n";238_СамоучительоЗ = ol — о2; // вычитание двух объектовo3.get_xy(x, у ) ;оЗ.showq();cout « " ( o l - о2) X: " « х « ", Y: " « у « "\n";оЗ = ol; // присваивание объектовоЗ.get_xy(х, у);o3.Showq();cout « "(оЗ = ol) X: " « х « ", Y: " « у « "\n";return 0;4.
Переработайте программу из вопроса 3 так, чтобы в ней использовалисьдружественные оператор-функции.Глава 8Введение в системуввода/вывода C++Начиная с первой главы этой книги, создавая свои программы, мы пользовались стилем ввода/вывода C++. Теперь настало время изучить его болееподробно. Как и в языке С, в C++ имеется развитая, гибкая и достаточнополная система ввода/вывода.
Важно понимать, что в C++ по-прежнемуподдерживается вся система ввода/вывода С. Кроме этого в C++ включендополнительный набор объектно-ориентированных подпрограмм ввода/вывода. Главным преимуществом системы ввода/вывода C++ являетсято, что она может перегружаться для создаваемых вами классов. Это отличиепозволяет легко встраивать в систему ввода/вывода C++ новые создаваемыевами типы данных.Как и в С, в системе объектно-ориентированного ввода/вывода C++ имеется незначительная разница между консольным и файловым вводом/выводом.На самом деле, консольный и файловый ввод/вывод — это просто разныйвзгляд на один и тот же механизм.
В этой главе в примерах используетсяввод/вывод на консоль (в данном случае на экран монитора), но представленная информация вполне применима и для ввода/вывода в файл(ввод/вывод в файл более детально исследуется в главе 9).К моменту написания этой книги использовались две версии библиотекиввода/вывода C++: старая, основанная на изначальной спецификации C++,и новая, определенная единым международным стандартом Standard C++.С точки зрения программиста для решения подавляющего большинства задач обе эти библиотеки идентичны. Так происходит потому, что новая библиотека ввода/вывода — это по существу просто обновленная и усовершенствованная версия старой библиотеки.
Фактически, почти все отличиядвух версий скрыты от вас, поскольку касаются не способа использованиябиблиотек, а способа их реализации. Для программиста главное отличие заключается в том, что новая библиотека ввода/вывода C++ имеет несколькодополнительных возможностей и определяет несколько новых типов данных.Таким образом, новая библиотека ввода/вывода — это по существу простонесколько улучшенная старая. Почти все уже написанные для старой библиотеки программы при использовании новой будут компилироваться без какихбы то ни было существенных изменений.
Поскольку прежняя библиотекаввода/вывода ныне считается устаревшей, данная книга описывает только240Самоучитель C++новую библиотеку, как это определено стандартом Standard C++. Тем неменее, большая часть информации вполне применима и к старой библиотеке ввода/вывода.Эта глава охватывает несколько аспектов системы ввода/вывода C++, включая форматируемый ввод/вывод, манипуляторы ввода/вывода и созданиепользовательских функций ввода/вывода.
Как вы увидите в дальнейшем, всистеме ввода/вывода C++ имеется множество черт, характерных для системы ввода/вывода С.Повторение пройденногоПеред тем как продолжить, необходимо правильно ответить на следующиевопросы и сделать упражнения.1. Создайте иерархию классов для хранения информации о летательных аппаратах. Начните с общего базового класса airship, предназначенного дляхранения количества перевозимых пассажиров и количества перевозимого груза (в фунтах). Затем создайте два производных от airship классаairplane и balloon.