Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 9
Текст из файла (страница 9)
set ("Мне нравится C++");si. show ( ) ;s2. show() ;return 0;В этой программе для выделения и освобождения памяти используютсяфункции maUoc() и free(). Хотя этот пример совершенно правилен, как выувидите далее в этой книге, в C++ есть и иной путь управления распределением динамической памяти.VВ предыдущей программе заголовочные файлы библиотечных функций языкаС оформлены в соответствии с новым стилем оформления заголовков. Какуже упоминалось в главе 1, если ваш компилятор не поддерживает такие за-50____________Самоучитель C++головки, просто замените их стандартными заголовочными файлами С.
То жесамое можно сказать о всех программах этой книги, в которых используютсябиблиотечные функции С.3. В следующем примере приведен интересный способ использования конструктора и деструктора объекта. В программе объект класса timer предназначен для измерения временного интервала между его созданием и удалением.При вызове деструктора на экран выводится прошедшее с момента созданияобъекта время. Вы могли бы воспользоваться подобным объектом для измерения времени работы программы или времени работы функции внутри блока. Просто убедитесь, что объект исчезает в момент завершения временногоинтервала.^include <iostream>#include <ctime>using namespace std;class timer (clock_t start;public:timer ( } ; // конструктор~timer ( ) ; // деструктор>;timer: : timer (){start=clock() ;timer: : -timer ()jclock_t end;•end=clock() ;cout « "Затраченное время:" « (end-start) /CLOCKS_PER_SEC <<"\n";}int main()(timer ob;char c;// Пауза .
. .cout « "Нажмите любую клавишу, затем ENTER: ";cin » с;return 0;1В программе используется стандартная библиотечная функция clock(), котораявозвращает число временных циклов с момента запуска программы. Если разделить это число на CLOCKS_PER_SEC, можно получить значение в секундах.Глава 2. Введение в классы511. Измените класс queue (см. упражнения гл. 1) так, чтобы провести инициализацию с помощью конструктора.2. Создайте класс stopwatch для имитации секундомера. Используйте конструктор для начальной установки секундомера в 0.
Образуйте две функции-членаstart() и stop() соответственно для запуска и остановки секундомера. Включите в класс и функцию-член show() для вывода на экран величины истекшего промежутка времени. Также используйте деструктор для автоматического вывода на экран времени, прошедшего с момента создания объектакласса stopwatch, до его удаления. (Для простоты время приведите в секундах.)3. Что неправильно в конструкторе, показанном в следующем фрагменте?class sample {double a, b, с;public:double sample!); // ошибка, почему?2.2. Конструкторы с параметрамиКонструктору можно передавать аргументы. Для этого просто добавьте необходимые параметры в объявление и определение конструктора. Затем приобъявлении объекта задайте параметры в качестве аргументов. Чтобы понять, как это делается, начнем с короткого примера:^include <iostream>using namespace std;class myclass {int a;public:myclass{int x); // конструкторvoid show() ;myclass::myclass(int x){cout « "В конструкторе\п";a = x;\void myclass::show(){cout « a « " \ n " ;52Самоучитель C++int main()imyclass ob(4);ob.
show()-;return 0;Здесь конструктор класса myclass имеет один параметр. Значение, передаваемое в myclass(), используется для инициализации переменной а. Обратите особое внимание на то, как в функции main() объявляется объект ob.Число 4, записанное в круглых скобках, является аргументом, передаваемымпараметру х конструктора mycIassQ, который используется для инициализации переменной а.Фактически синтаксис передачи аргумента конструктору с параметром является сокращенной формой записи следующего, более длинного выражения:myclass ob = myclass(4);Однако большинство программистов C++ пользуются сокращенной формойзаписи.
На самом деле, с технической точки зрения между этими двумяформами записи имеется небольшое отличие, связанное с конструкторомкопий (copy constructor), о котором будет рассказано позже. На данном этапе об этом отличии можно не беспокоиться.,В отличие от конструктора деструктор не может иметь параметров. Смыслэтого понять достаточно просто: отсутствует механизм передачи аргументовудаленному объекту.Примеры1. Вполне допустимо передавать конструктору несколько аргументов. В этомпримере конструктору myclass() передается два аргумента:#include <iostream>using namespace std;class myclass {int a, b;public:myclass(int x, int y); // конструкторvoid show (};Глава 2. Введение^ в классыm y c l a s s : i m y c l a s s ( i n t х,53int у)cout « "В конструкторе\п";а = х;ь - у;-/oid myclass: :show()cout « a « ' ' « b « "\n";int main ( }myclass o b ( 4 , 7) ;ob.
show() ;return 0;Здесь 4 передается в х, а 7 передается в у. Такой же общий подход используется для передачи любого необходимого числа аргументов (ограниченного,разумеется, возможностями компилятора).2. Здесь представлена следующая версия класса stack, в котором конструктор спараметром используется для присвоения стеку "имени".
Это односимвольное имя необходимо для идентификации стека в случае возникновения ошибки.^include <iostream>using namespace std;^define SIZE 10// Объявление класса stack для символовclass stack {char s t c k [ S I Z E ] ; // содержит стекint tos; // индекс вершины стекаchar who; // идентифицирует стекpublic:stack(char с ) ; // конструкторvoid push(char ch) ; // помещает в стек символchar pop ( } ; // выталкивает из стека символ// Инициализация стекаstack: :stack(char с)tos = 0;who = с;54__СамоучительC++cout « "Работа конструктора стека " « who « "\п";)// Помещение символа в стекvoid stack: :push(char ch){if (tos==SIZE) {cout « "Стек " « who « " полон \n";return;}stck [tos]=ch;tos-н-;!// Выталкивание символа из стекаchar stack: :pop(){if (tos==0) {cout « "Стек " « who « " пуст ";return 0; // возврат нуля при пустом стекеtos — ;return stck[tos];int main{)// образование даух автоматически инициализируемых стековstack si ('A') , s2('B') ;int i;si.
push ( 'a' ) ;s2.push('x') ;sl.push('b') ;s2.push('y') ;si. push ( 'c' ) ;s2 . push ( ' z ' ) ;// Это вызовет сообщения об ошибкахfor(i=0; i<5; i++) cout « "символ из стека si: "« si. pop {) « "\n";for(i=0; i<5; i+-t-) cout « "символ из стека s2 : "« s2.pop() « "\n";return 0;Присвоение "имени" объекту, как показано в примере, является особеннополезным при отладке, когда важно выяснить, какой из объектов вызываетошибку.Глава 2. Введение в классы55_3. Здесь показан новый вариант разработанного ранее класса strtype, в которомиспользуется конструктор с параметром:^include <iostream>#include <cstring>^include <cstdlib>using namespace std;class strtype {char *p;int len;public:strtype(char *ptr);-strtype ( } ;void show() ;strtype::strtype(char *ptr)len = strlenfptr);p = (char *) malloc(len + 1 ) ;cout « "Ошибка выделения памяти\п";exit (1) ;strcpy(p, p t r ) ;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;В этой версии класса strtype строка получает свое начальное значение с помощью конструктора.56Самоучитель_C++4. Конструктору объекта можно передать не только константы, но и любые допустимые выражения с переменными. Например, в следующей программедля создания объекта используется пользовательский ввод:#include <iostream>using namespace std;class myclass {int i, j;public:myclass (int a, int b) ;void show() ;};myclass: :myclass (int a, int b)!i = a;j = b;"void myclass: : show ( ){cout « i « ' ' « j « "\n";}int main { ){int x, y;cout « "Введите два целых: ";cin » x » у;// использование переменных для создания obmyclass ob(x, у) ;ob.showf) ;return 0;Эта программа иллюстрирует важное свойство объектов.
Объекты могут создаваться по мере необходимости, точно в соответствии с возникающей в момент их создания ситуацией. Когда вы побольше узнаете о C++, вы увидите,какой полезной является возможность создания объектов "на ходу".Упражненияения]1. Измените класс stack так, чтобы память для стека выделялась динамически.При этом длина стека должна задаваться параметром конструктора. (Не забудьте освободить эту память с помощью деструктора.)Глава 2, Введение в классы572. Создайте класс t_and__d, которому при его создании передается текущее системное время и дата в виде параметров конструктора.
Этот класс долженвключать в себя функцию-член, выводящую время и дату на экран.(Подсказка: Для нахождения и вывода на экран этих данных воспользуйтесьстандартной библиотечной функцией времени и даты.)3. Создайте класс box, конструктору которого передаются три значения типаdouble, представляющие собой длины сторон параллелепипеда. Класс boxдолжен подсчитывать его объем и хранить результат также в виде значениятипа double. Включите в класс функцию-член vol(), которая будет выводитьна экран объем любого объекта типа box.2.3.