Скачать 4.44 Mb.
|
Глава 2 в классы В этой главе вводятся понятия классов и объектов. В следующих разделах фактически описаны почти все аспекты программиро-на C++, поэтому советуем вам читать Повторение пройденного Перед тем как продолжить, необходимо правильно ответить на следующие вопросы и сделать упражнения.
в класс открытую функцию для запоминания имени и адреса, открытую функцию, которая выводит эти имя и адрес на экран. (Назовите эти функции store() и display(). ) 3. Создайте перегружаемую функцию rotate(), которая циклически сдвигает влево свой аргумент и возвращает результат. Перегрузите ее так, она работала с целыми (mt) и длинными целыми (long). (Сдвиг по обычному сдвигу, за исключением того, что выдвигаемый с конца слова бит появляется на другом его конце.) 4. Что неправильно в следующем фрагменте? ^include using namespace std; class myclass { int i; public: Самоучитель C++ int main () { myclass ob; ob.i = 10; 2.1. Конструкторы и Если вы писали очень длинные программы, то знаете, что в некоторых частях программы обычно требуется инициализация. Необходимость в инициализации еще более часто проявляется при работе с объектами, если обратиться к реальным проблемам, то, фактически, для создаваемого вами объекта требуется какого-то вида инициализация. Для разрешения этой проблемы в C++ имеется функция-конструктор (constructorfunction), включаемая в описание класса. Конструктор класса вызывается всякий раз при создании объекта этого класса. Таким образом, любая необходимая объекту инициализация при наличии конструктора Конструктор имеет то же имя, что и класс, частью которого он является, и не имеет возвращаемого значения. Например, ниже представлен класс с конструктором: ttinclude using namespace std; class myclass { int a; public: myclass (); // конструктор void show() ; myclass::myclass() { cout « "В конструкторе\п"; a-10; ) void myclass : :show () { cout « a; 2. Введение в классы _ 45 int main () { my class ob; ob.show)); return 0; I В этом простом примере значение а инициализируется конструктором myclass(). Конструктор вызывается тогда, когда создается объект ob. Объект, в свою очередь, создается при выполнении инструкции объявления объекта. Важно понимать, что в C++ инструкция объявления переменной янляется "инструкцией действия". При программировании на С инструкции объявления переменных понимаются просто как создание переменных. Однако в C++, поскольку объект может иметь конструктор, инструкция объявления переменной может вызывать выполнение записанных в конструкторе действий. Обратите внимание, как определяется конструктор myclassQ. Как уже говорилось, он не имеет возвращаемого значения. В соответствии с формальными правилами синтаксиса C++ конструктор не должен иметь возвращаемого глобальных объектов конструктор объекта вызывается нается выполнение программы. Для локальных объектов конструктор вызыва-раз при выполнении инструкции объявления переменной. обратной конструктору, является деструктор (destructor). Эта вызывается при удалении объекта. Обычно при работе с объектом в момент его удаления должны выполняться некоторые действия. Например, при создании объекта для него выделяется память, которую необходимо освободить при его удалении. Имя деструктора совпадает с именем класса, но с символом ~ (тильда) в начале. Пример класса с деструктором: ^include using namespace std; class myclass ( int a; public: myclass (); // конструктор -myclass () ; // деструктор void show () ; myclass : :myclass() { cout «< "Содержимое конструктора\п"; a = 10; 46 C++ myclass::~myclass() { cout « "Удаление. . Л п"; void myclass::show() { cout « a « "\n"; } int main() I myclass ob; ob.show () ; return 0 ; класса вызывается при удалении объекта. Локальные объекты тогда, когда они выходят из области видимости. Глобальные объ-удаляются при завершении программы. Адреса конструктора и деструктора получить невозможно. 9 Фактически как конструктор, так и деструктор могут выполнить любой тип операции. Тем не менее считается, что код внутри этих функций не должен делать ничего, не имеющего отношения к инициализации или возвращению объектов в исходное состояние. Например, конструктор в предшествующем примере мог бы рассчитать число pi с точностью до 100 знаков после запятой. Однако применение конструктора или деструктора для действий, прямо не связанных с инициализацией, является очень плохим стилем программирования и его сле- ; Примеры 1. Вспомните, что в созданном в главе 1 классе stack для установки переменной стека требовалась функция инициализации. Это именно тот , для выполнения которого и придуман конструктор. Здесь улучшенная версия класса stack, где для автоматической зации объекта стека при его создании используется конструктор: ^include using namespace std; ^define SIZE 10 Глава 2. Введение в классы 47 класса stack для символов class stack { char stck[SIZE]; // содержит int tos; // индекс вершины public: stack (); // конструктор void push(char ch); // помещает в стек символ char pop(); // выталкивает из стека символ // stack::stack() { cout « "Работа конструктора стека \п"; tos=0; // Помещение символа в void stack: :push (charch) if {tos==SIZE} { cout « "Стек полон"; return; } stck[tos]=ch; tos++; J // Выталкивание символа из char stack::pop() if (tos==0) { cout « "Стек пуст"; return 0; // возврат нуля при пустом } tos—; return stck[tos]; intmain ( ) // образование двух автоматически инициализируемых stack si, s2; int i ; si.push ('a'); s2.push( 'x') ; sl.push('b'); 48 Самоучитель C++ s2.push Су'); si.push('с'); s2.push('z'); for(i=0; i<3; .i++) cout « "символ из si:" « sl.popO « "\n"; = 0; i<3; i++} cout « "символ из s2:" « s2.pop() « "\n"; return 0; Обратите внимание, что теперь вместо отдельной, специально вызываемой программой функции задача инициализации выполняется конструктором ав-Это важное положение. Если инициализация выполняется ав-при создании объекта, то это исключает любую возможность того, что по ошибке инициализация не будет выполнена. Вам, как программисту, не нужно беспокоиться об инициализации — она автоматически выпри появлении объекта. 2. В следующем примере показана необходимость не только конструктора, но и деструктора. В примере создается простой класс для строк, который содержит саму строку и ее длину. Когда создается объект strtype, для хранения строки выделяется память, и начальная длина строки устанавливается равной нулю. Когда объект strtype удаляется, эта память освобождается. ftinclude ^include ^include using namespace std; ^define SIZE 255 class strtype { char *p; int len; public: , // конструктор -strtype (}; // деструктор void set(char *ptr); void show(); // Инициализация объекта строка strtype::strtype() ( p=(char *) malloc(SIZE); if(!p) { cout "Ошибка выделения памяти\п"; exit (1) ; -be эияв! ±эваижбэтои эн doj-UifMuwox шва ииоэ 'i эавш а иве иинэипбофо пэиию тчаон о ииа±о±эа±ооо а 1янэ1/мс1офо о Х1яньэ±ои1/дид \чиивф э/чньоэо/лх/еег ei/wvBdJodu иэТпАНяНэби g иэин иони и чхээ ++э я 'элиня ио!£ a aaifBf эхиййаА ня явя 'нэкиявс1п оннэшйэяоэ cfewHcin хохе кхох '()33JJ и ()э(щвш ииПянАф ихкивп винэйжодоаэо и кинэ1гэЬ1ча Biff эмшгйлойм иохе а () иттэш > а ртол I тэяо<3ъэ., : ртол „u\d иинэктэЫА ис[п илвжеп эинэИЖОрояэо // .'0=иэх 6^ nooBir» а эинэНэад 50 _ __ Самоучитель C++ головки, просто замените их стандартными заголовочными файлами С. То же самое можно сказать о всех программах этой книги, в которых используются библиотечные функции С. 3. В следующем примере приведен интересный способ использования конструктора и деструктора объекта. В программе объект класса timer предназначен для измерения временного интервала между его созданием и При вызове деструктора на экран выводится прошедшее с момента объекта время. Вы могли бы воспользоваться подобным объектом для измерения времени работы программы или времени работы функции внутри блока. Просто убедитесь, что объект исчезает в момент завершения временного интервала. ^include #include using namespace std; class timer ( clock_t start; public: timer ( } ; // конструктор -timer( ) ; //деструктор IS timer: : timer() { start=clock() ; ) timer: : -timer() t clock_t end; end=clock(); cout « "Затраченное время:" « (end-start)/CLOCKS_PER SEC<<"\n";
В программе используется стандартная библиотечная функция clock(), которая возвращает число временных циклов с момента запуска программы. Если . это число на CLOCKS_PER_SEC, можно получить значение Глава 2. Введение в классы 51
ского вывода на экран времени, прошедшего с момента создания класса stopwatch, до его удаления. (Для простоты время приведите в с 3. Что неправильно в конструкторе, показанном в следующем фрагменте? class sample { double a, b, с; public: double sample!); // ошибка, 2.2. Конструкторы с параметрами Конструктору можно передавать аргументы. Для этого просто добавьте необходимые параметры в объявление и определение конструктора. Затем при объявлении объекта задайте параметры в качестве аргументов. Чтобы понять, как это делается, начнем с короткого примера: ^include using namespace std; class myclass { int a; public: myclass{int x) ; // конструктор void show () ; myclass::myclass(int x) { cout « "В конструкторе\п"; a = x; 1 void myclass::show() { cout « a « "\n"; 52 C++ int mai 1 myclass ob(4) ; ob. show ()-; return 0 ; Здесь конструктор класса myclass имеет один параметр. Значение, передаваемое в myclass(), используется для инициализации переменной а. Обратите особое внимание на то, как в функции main() объявляется объект ob. Число 4, записанное в круглых скобках, является аргументом, передаваемым параметру х конструктора mycIassQ, который используется для инициализации переменной а. синтаксис передачи аргумента конструктору с параметром явля-сокращенной формой записи следующего, более д myclass ob = myclass (4) ; большинство программистов C++ пользуются сокращенной формой записи. На самом деле, с технической точки зрения между этими двумя формами записи имеется небольшое отличие, связанное с конструктором копий (copy constructor), о котором будет рассказано позже. На данном этапе об этом отличии можно не беспокоиться. ты**** :У' |
П равила пользования услугами информационно-библиотечного центра Правила пользования услугами информационно-библиотечного центра – документ, фиксирующий взаимоотношения пользователя с информационно-библиотечным... |
Ханк Рейнвотер Как пасти котов. Наставление для программистов, руководящих... Посвящается Дэвиду, моему любимому сыну, память о тебе меня неизменно вдохновляет |
||
Дипломная работа Степень удовлетворенности пользователей в документах по музыкальному искусству 25 |
Задача учителя-методиста в современной школе научить созданию новых... Созданы педагогические папки-копилки таких учителей как Ухмусултанова А. С., Нурмагомедова Н. Д., Яшувова А. М., Карамурзаева Б.... |
||
Форм массовой работы Традиционные и инновационные, серьезные и игровые формы массового формирования информационной культуры пользователей |
«Поддержка дистанционных олимпиад: новые идеи и технологии» В данных тезисах рассматривается вопрос быстрого и удобного создания сайтов олимпиад с помощью типового сайта поддержки олимпиад,... |
||
Флот в первой половине XIX века Император Павел I и военно-морские силы Поэтому флот России, пользовавшийся в конце XVIII века заслуженной славой и состоявший из опытных и смелых моряков, вместе с тем... |
Приказ №50/3 от 30. 08. 2013г. Анализ работы библиотеки мкоу «Трусовская... В библиотеке образовательного учреждения художественной литературы насчитывается 3703 экземпляра, учебной 1588, электронных изданий... |
||
Реферат Дипломный проект посвящен модернизации локальной сети организации «Надежный Контакт» Проанализирован список задач решаемых с помощью локальной сети; также были изучены аппаратные и программные средства, необходимые... |
Курсовая работа студента 342 группы Матвеева Н. Н. «Реализация отмены/повтора... Средств разработчиков и проектировщиков по можно отдельно выделить так называемые case-средства (case computer-Aided Software Engineering).... |
Поиск на сайте Главная страница Литература Доклады Рефераты Курсовая работа Лекции |