Г. Шилтд - Самоучитель C++ (PDF), страница 21
Описание файла
PDF-файл из архива "Г. Шилтд - Самоучитель C++ (PDF)", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 21 страницы из PDF
Например, следующаяинструкция вполне допустима:const int &ref = 10;В ссылках такого типа выгода невелика, но иногда их можно встретить впрограммах.Упражненияения]1. Попытайтесь найти полезное применение для независимой ссылки.Глава 4. Массивы, указатели и ссылкиLПроверка усвоенияматериала главыТеперь вам необходимо выполнить следующие упражнения и ответить навопросы:1. Ниже представлен класс a_type. Создайте двумерный, два на пять, массиви дайте каждому элементу массива начальное значение по своему выбору.Затем выведите содержимое массива на экран.class a_type {double a, b;public:a_type(double x, double y) {a = x;b = y;}void show() { cout « a « ' ' « b « "\n"; });2.
Модифицируйте решение предыдущей задачи так, чтобы доступ к массиву осуществлялся через указатель.3. Что такое указатель this?4. Покажите основные формы операторов new и delete. Какие преимуществаони дают в сравнении с функциями malloc() и free()?5. Что такое ссылка? Какое можно получить преимущество от использованияссылки в качестве параметра?6.
Создайте функцию recipQ, которая получает один параметр-ссылку на значение типа double. Эта функция должна изменить значение своего параметра на обратное. Напишите программу вывода на экран результатовработы функции.Проверка усвоенияматериала в целомВ этом разделе проверяется, хорошо ли вы усвоили материал этой и предыдущих глав.1. Пусть дан указатель на объект. Какой оператор использовать для доступак члену объекта?2. В главе 2 была создана программа с классом strtype, в которой памятьдля строки выделялась динамически. Переделайте программу (показанную здесь для удобства) так, чтобы в ней использовались операторы newи delete.142_СамоучительC++#include <iostream>^include <cstring>linclude <cstdlib>using namespace std;class strtype {char *p;int len;public:strtype (char *ptr) ;-strtype {) ;void showf) ;);strtype: : strtype (char *ptr){len = strlen(ptr)p=(char *} malloc (len+1) ;if(ip) {cout « "Ошибка выделения памяти \п";exit{l) ;strcpy(p, ptr) ;strtype : : -strtype ( ){cout « "Освобождение памяти по адресу р\п";free (p) ;}void strtype: : show (){cout « p « " — длина: " « len;cout « "\n";}int main { )(strtype si {"Это проверка") , з2("Мне нравится C++");si .show () ;s2 .
show ( ) ;return 0;3. Переделайте любую программу из предьщущей главы так, чтобы в нейиспользовались ссылки.Глава 5Перегрузка функцийВ этой главе вы более подробно изучите перегрузку функций. Хотя с этойтемой вы уже встречались, имеется несколько дополнительных аспектов, скоторыми необходимо познакомиться. Здесь вы найдете ответы на следующие вопросы: как перегрузить конструктор, как создать конструктор копий,как функции передать аргументы по умолчанию, как можно избежать неоднозначности при перегрузке функций.Повторение пройденногоПеред тем как продолжить, необходимо правильно ответить на следующиевопросы и сделать упражнения.1.
Что такое ссылка? Приведите две важных области применения ссылок?2. Покажите, как с помощью оператора new выделить память для значенийтипа float и int. Покажите также, как освободить память с помощью оператора delete.3. Какова основная форма оператора new, используемая для инициализациидинамических переменных? Приведите конкретный пример.4. Дан следующий класс.
Как инициализировать массив из десяти элементов так, чтобы переменная х получила значения от 1 до 10 включительно.Class samp (int x;public:sump(int i) { x = n; }int getx () [ return x; }5. Перечислите достоинства и недостатки параметров-ссылок.6. Может ли быть инициализирован массив, память для которого выделяется динамически?144Самоучитель C++7.
На основе следующего прототипа создайте функцию mag(), повышающую порядок значения переменной mim до того уровня, который заданпеременной order:void mag(long Snum, long order);Например, если переменная num равна 4, а переменная order равна 2, топосле выполнения функции mag() переменная num должна стать равной400. Напишите демонстрационную программу, показывающую, чтофункция работает.5.1. Перегрузка конструкторовВ программах на C++ перегрузка конструктора класса вполне обычна.(Деструктор, однако, перегружать нельзя.) Имеется три основных причиныперегрузки конструктора, которая, как правило, выполняется либо дляобеспечения гибкости, либо для поддержки массивов, либо для созданияконструкторов копий. В этом разделе рассказывается об обеспечении гибкости и поддержке массивов, а о конструкторах копий — в следующем.Перед изучением примеров необходимо запомнить одну вещь: каждому способу объявления объекта класса должна соответствовать своя версия конструктора класса.
Если эта задача не решена, то при компиляции программыобнаружится ошибка. Именно поэтому перегрузка конструктора стольобычна для программ C++.Гу_.имеры•Вероятно, наиболее частое использование перегрузки конструктора — этообеспечение возможности выбора способа инициализации объекта.
Например, в следующей программе объекту ol дается начальное значение, а объекту о2 — нет. Если вы удалите конструктор с пустым списком аргументов,программа не будет компилироваться, поскольку у неинициализируемогообъекта типа samp не будет конструктора. И наоборот, если вы удалите конструктор с параметром, программа не будет компилироваться, поскольку небудет конструктора у инициализируемого объекта типа samp. Для правильнойкомпиляции программы необходимы оба конструктора.^include <iostream>using namespace std;class myclass {int x;public:// перегрузка конструктора двумя способамиmyclass{} { x = 0; J // нет инициализацииГлава 5.
Перегрузка функций745myclass(int n) { x = n; } // инициализацияint g e t x ( ) { return x; }};intmain()myclass ol(10); // объявление с начальным значениемmyclass o2; // объявление без начального значенияcout « "ol: " « ol.getxO « '\п';cout « "о2: " « o2,getx() « '\п';return 0;2. Другой традиционный довод в пользу перегрузки конструктора состоит втом, что такая перегрузка позволяет сосуществовать в программе как отдельным объектам, так и массивам объектов. Как вы, наверное, знаете по своемуопыту программирования, вполне обычно инициализировать отдельную переменную, тогда как инициализация массива встречается достаточно редко.(Гораздо чаще элементам массива присваиваются их значения в зависимостиот информации, получаемой уже при выполнении программы.) Таким образом, для сосуществования в программе неинициализированных массивовобъектов наряду с инициализированными объектами вы должны использовать конструктор, который поддерживает инициализацию, и конструктор,который ее не поддерживает.Например, для класса myclass из примера 1 оба этих объявления правильны:myclass ob{10);myclass ob[5];Обеспечив наличие обоих конструкторов (с параметрами и без параметров),вы в своей программе получаете возможность создавать объекты, которыепри необходимости можно либо инициализировать, либо нет.Естественно, что после определения конструктора с параметрами и конструктора без параметров, их можно использовать для создания инициализированных или неинициализированных массивов.
Например, в следующейпрограмме объявляются два массива типа myclass; при этом один из нихинициализируется, а другой нет:^include <iostream>using namespace std;class myclass {int x;public:// перегрузка конструктора двумя способамиmyclass!) { x = 0; } // нет инициализации146_СамоучительC++myclass(int n) { x = n; } // инициализацияint getx() { return x; }int main (){myclass ol[10]; // объявление массива без инициализации// объявление с инициализациейmyclass o2[10] = {1,2,3,4,5,6,7,8,9,10};int i;for(i=0; i<10; i++} {cout « "ol[ " « i « "]:" « ol [i] .
getx ( ) ;cout « ' \n' ;cout « "o2 [ " « i « "]:" « o2 [i] . getx ( ) ;cout « '\n' ;return 0;В этом примере все элементы массива ol конструктор устанавливает в нуль.Элементы массива о2 инициализируются так, как показано в программе.3. Другой довод в пользу перегрузки конструкторов состоит в том, что такаяперегрузка позволяет программисту выбрать наиболее подходящий методинициализации объекта. Чтобы понять, как это делается, рассмотрим следующий пример, в котором создается класс для хранения календарной даты.Конструктор datcQ перегружается двумя способами.
В первом случае данныезадаются в виде строки символов, в другом — в виде трех целых.^include <iostream>#include <cstdio> // заголовок для функции sscanfOusing namespace std;class date {int day, month, year;public:date (char *str) ;date (int m, int d, int y) {day = d;month = m;year = y,}void show() {cout « month « ' / ' « day « ' / ' ;Глава 5.
Перегрузка функций14_7_cout « year « ' \ n ' ;)};date::date{char *str){sscanf(str, "%d%*c%d%*c%d", smonth, £day, Syear);}int main (}{// использование конструктора для даты в виде строкиdate sdate("ll/l/92");// использование конструктора для даты в виде трех целыхdate idatefll, I, 92) ;sdate.showO ;idate.show();return 0;}Преимущество перегрузки конструктора date(), как показано в программе, втом, что вы можете выбрать ту версию инициализации, которая лучше всегоподходит к текущей ситуации. Например, если объект типа date создается в результате пользовательского ввода, то проще использовать строковую версию.Однако если объект типа date строится путем каких-то простых внутреннихрасчетов, то версия с тремя целыми параметрами становится, вероятно, болеепривлекательной.Хотя конструктор можно перегружать любое количество раз, лучше этим незлоупотреблять.
С точки зрения стилистики, конструктор имеет смысл перегружать только тогда, когда такая перегрузка позволяет адаптировать программу к часто встречающимся ситуациям. Например, еще одна перегрузкаконструктора date() для ввода трех восьмеричных целых вряд ли будет иметькакой-то смысл. Однако перегрузка конструктора date() для доступа к объекту типа time_t (тип данных для хранения системных даты и времени) моглабы оказаться весьма полезной.