Для программистов и опытных пользователей




Скачать 4.44 Mb.
Название Для программистов и опытных пользователей
страница 5/32
Дата публикации 20.09.2014
Размер 4.44 Mb.
Тип Документы
literature-edu.ru > Авто-обзор > Документы
1   2   3   4   5   6   7   8   9   ...   32
Глава 2

в классы

В этой главе вводятся понятия классов и объектов. В следующих

разделах фактически описаны почти все аспекты программиро-на C++, поэтому советуем вам читать

Повторение пройденного

Перед тем как продолжить, необходимо правильно ответить на следующие вопросы и сделать упражнения.

  1. Напишите программу, использующую стиль ввода/вывода C++ для ввода
    строки и затем вывода на экран ее длины.

  2. Создайте класс, который содержит информацию об имени и адресе. Хра­
    ните всю эту информацию в символьных строках закрытой части класса.

в класс открытую функцию для запоминания имени и адреса, открытую функцию, которая выводит эти имя и адрес на экран. (Назовите эти функции 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";

int

ma in()




(

timer ob;







char c;







// Пауза . . .







cout « "Нажмите любую клави

ишу, затем ENTER:




cin » с;




1

return 0;







В программе используется стандартная библиотечная функция clock(), которая возвращает число временных циклов с момента запуска программы. Если . это число на CLOCKS_PER_SEC, можно получить значение

Глава 2. Введение в классы 51

  1. Измените класс queue (см. упражнения гл. 1) так, чтобы провести инициали­
    зацию с помощью конструктора.

  2. Создайте класс stopwatch для имитации секундомера. Используйте конструк­
    тор для начальной установки секундомера в 0. Образуйте две функции-члена
    start() и stop() соответственно для запуска и остановки секундомера. Вклю­
    чите в класс и функцию-член show() для вывода на экран величины истек­
    шего промежутка времени. Также используйте деструктор

ского вывода на экран времени, прошедшего с момента создания класса 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), о котором будет рассказано позже. На данном эта­пе об этом отличии можно не беспокоиться.

ты****

:У'
1   2   3   4   5   6   7   8   9   ...   32

Похожие:

Для программистов и опытных пользователей icon П равила пользования услугами информационно-библиотечного центра
Правила пользования услугами информационно-библиотечного центра – документ, фиксирующий взаимоотношения пользователя с информационно-библиотечным...
Для программистов и опытных пользователей icon Ханк Рейнвотер Как пасти котов. Наставление для программистов, руководящих...
Посвящается Дэвиду, моему любимому сыну, память о тебе меня неизменно вдохновляет
Для программистов и опытных пользователей icon Дипломная работа
Степень удовлетворенности пользователей в документах по музыкальному искусству 25
Для программистов и опытных пользователей icon Задача учителя-методиста в современной школе научить созданию новых...
Созданы педагогические папки-копилки таких учителей как Ухмусултанова А. С., Нурмагомедова Н. Д., Яшувова А. М., Карамурзаева Б....
Для программистов и опытных пользователей icon Форм массовой работы
Традиционные и инновационные, серьезные и игровые формы массового формирования информационной культуры пользователей
Для программистов и опытных пользователей icon «Поддержка дистанционных олимпиад: новые идеи и технологии»
В данных тезисах рассматривается вопрос быстрого и удобного создания сайтов олимпиад с помощью типового сайта поддержки олимпиад,...
Для программистов и опытных пользователей icon Флот в первой половине XIX века Император Павел I и военно-морские силы
Поэтому флот России, пользовавшийся в конце XVIII века заслуженной славой и состоявший из опытных и смелых моряков, вместе с тем...
Для программистов и опытных пользователей icon Приказ №50/3 от 30. 08. 2013г. Анализ работы библиотеки мкоу «Трусовская...
В библиотеке образовательного учреждения художественной литературы насчитывается 3703 экземпляра, учебной 1588, электронных изданий...
Для программистов и опытных пользователей icon Реферат Дипломный проект посвящен модернизации локальной сети организации «Надежный Контакт»
Проанализирован список задач решаемых с помощью локальной сети; также были изучены аппаратные и программные средства, необходимые...
Для программистов и опытных пользователей icon Курсовая работа студента 342 группы Матвеева Н. Н. «Реализация отмены/повтора...
Средств разработчиков и проектировщиков по можно отдельно выделить так называемые case-средства (case computer-Aided Software Engineering)....
Литература


При копировании материала укажите ссылку © 2015
контакты
literature-edu.ru
Поиск на сайте

Главная страница  Литература  Доклады  Рефераты  Курсовая работа  Лекции