Конструкторы и деструкторы
Инициализация элементов данных класса в программе С++ с использованием конструктора, который запускается для каждого объекта. Применение операции ссылки в языке С++ для взятия адреса объекта. Деструкция как освобождение заказанной памяти, закрытие файлов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | русский |
Дата добавления | 30.10.2011 |
Размер файла | 20,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
Введение
1. Конструкторы классов
2. Операция ссылки
3. Деструкторы классов
4. Пpимеp программы с конструкторами и деструкторами
Заключение
Список литературы
Введение
При создании объектов одной из наиболее широко используемых операций которую вы будете выполнять в ваших программах, является инициализация элементов данных объекта. Единственным способом, с помощью которого вы можете обратиться к частным элементам данных, является использование функций класса. Чтобы упростить процесс инициализации элементов данных класса, C++ использует специальную функцию, называемую конструктором, которая запускается для каждого создаваемого вами объекта. Подобным образом C++ обеспечивает функцию, называемую деструктором, которая запускается при уничтожении объекта.
Конструктор представляет собой метод класса, который облегчает вашим программам инициализацию элементов данных класса.
Ш Конструктор имеет такое же имя, как и класс.
Ш Конструктор не имеет возвращаемого значения.
Ш Каждый раз, когда ваша программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует.
Ш Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.
Ш Деструктор имеет такое же имя, как и класс, за исключением того, что вы должны предварять его имя символом тильды (~).
Ш Деструктор не имеет возвращаемого значения.
Конструктор можно представить как функцию, которая помогает вам строить (конструировать) объект. Подобно этому, деструктор представляет собой функцию, которая помогает вам уничтожать объект. Деструктор обычно используется, если при уничтожении объекта нужно освободить память, которую занимал объект.
1. Конструкторы классов
После того как класс определен и заданы объекты этого класса, как правило, возникает необходимость выполнения каких-либо действий по инициализации каждого из объектов. Под инициализацией в данном случае понимается выполнение некоторых начальных действий в программе, для того, чтобы объект мог успешно функционировать. При этом для разных классов могут понадобиться существенно различные способы инициализации. Такими действиями могут быть, например, открытие файлов, загрузка драйверов, динамический заказ дополнительной оперативной памяти, присвоение начальных значений элементам данных. Для выполнения действий такого рода можно было бы воспользоваться какой-либо специально определенной программистом функцией-членом класса, например InitObject или SetObject. Вместе с тем, это налагает на программиста дополнительные обязанности, например, записывать вызов этих функций для каждого вновь определяемого объекта. Преодолеть это неудобство в С++ довольно просто, используя конструкторы классов. Для некоторого класса конструктор - это функция, являющаяся его членом и имеющая имя, совпадающее с именем самого класса, а также не содержащая типа возвращаемого значения. Особенностью функции является ее автоматический вызов для каждого из объектов класса в тот момент, когда по естественному ходу выполнения программы встречается описание объекта:
class Vectors{
int A[25], B[25], C[25];
public:
Vectors ( );
void VectorsSum ( Vectors *, Vectors * );
// Другие методы
};
Vectors::Vectors( )
{
memset ( A, 0, 25);
memset ( B, 0, 25);
memset ( C, 0, 25);
}
void main( )
{
Vectors First; // В этом месте будут вызваны
Vectors Second; // конструкторы для First и Second.
// Операторы программы
}
Конструктор представляет собой специальную функцию, которую C++ автоматически вызывает каждый раз при создании объекта. Обычное назначение конструктора заключается в инициализации элементов данных объекта. Конструктор имеет такое же имя, как и класс. Класс с именем file использует конструктор с именем file. Вы определяете конструктор внутри своей программы так же, как и любой метод класса. Единственное различие заключается в том, что конструктор не имеет возвращаемого значения. Когда вы позже объявляете объект, вы можете передавать параметры конструктору. Одним из важных свойств конструктора является его автоматический вызов при описании любого объекта какого-либо класса, использующего конструктор, что снимает с программиста задачу своевременного отслеживания инициализации вновь вводимых объектов. В общем случае конструкторы классов могут иметь списки пара- метров, которые могут потребоваться при инициализации. При этом программист будет обязан задать список инициализации при описании каждого нового объекта, например, рассмотрим класс дат с соответствующим конструктором:
class Date{
int Month, Day, Year;
public:
Date(int , int, int);
void GetDate( );
};
Date::Date ( int M, int D, int Y )
{
Month = M; Day = D; Year = Y;
}
void main( )
{
Date MemDay( 10, 15, 1993 ); // Обязательная инициали-
Date NewDate = MemDay; // зация, иначе :
Date Another; // Ошибка !
// Операторы программы
}
Ограничением использования конструкторов является запрет использования его имени в качестве явного аргумента внутри самого этого класса:
class Vector{
int Vec[5];
Vector V; // Ошибка
public:
Vector ( Vector ); // Ошибка
// Другие методы
};
В данном случае определение объекта V как объекта этого же класса Vector должно было привести к бесконечному рекурсивному выделению памяти, однако транслятор с языка С++ просто выдаст соответствующее сообщение о синтаксической ошибке. C++ позволяет указывать значения по умолчанию для параметров функции. Если пользователь не указывает каких-либо параметров, функция будет использовать значения по умолчанию. Конструктор не является исключением; ваша программа может указать для него значения по умолчанию так же, как и для любой другой функции. Например, следующий конструктор employee использует по умолчанию значение оклада равным 10000.0, если программа не указывает оклад при создании объекта. Однако программа должна указать имя служащего и его номер. Конструкторы, не имеющие параметров, называются конструкторами по умолчанию:
#include "iostream.h" // для cin, cout см.следующие главы
class X{
public:
char *PointX;
X ( ) { cout << "Объявлен объект класса X!";
PointX = (char* 0);
}; // X( ) - конструктор по умолчанию
};
X NewX;
void main( )
{
cout << "Конец работы.";
}
Результатом работы этой программы будет:
Объявлен объект класса Х!
Конец работы.
Как и другие методы класса конструкторы могут быть перегружаемыми, т.е. могут использовать несколько определений с различными списками параметров:
class Intg {
char Number[5];// Число можно хранить символьно
int N;// И целым типом
public:
Intg ( char *Str ) {// Конструктор для 1-го случая
if ( strlen(Str) > 5 )
cout<< "Превышение размера числа";
else strcpy( Number, Str );
};
Intg ( int L ) { N = L }; // Конструктор для второго случая
};
void main( )
{
Intg First ( "125" ); // Вызов первого конструктора
Intg Second ( 125 ); // Вызов второго конструктора
// Другие операторы программы
}
2. Операция ссылки
Операция ссылки "&" в базовом языке С использовалась для взятия адреса объекта (переменных, массивов, структур, функций и т.п.). В С++ расширены возможности операции ссылки. При этом появилась новая концепция ссылки в операторах объявления. Рассмотрим пример.
int Handle;
int *New = &Handle;
int &Next = Handle;
В этом примере переменная Next не является указателем на тип int, а носит название ссылки на объект типа int. Эта переменная должна быть проинициализирована при ее объявлении. Далее в программе она становится некоторым синонимом объекта Handle для использования этого объекта как единого целого. В общем случае можно определить ссылки и на более сложные объекты, например, структуры или объекты классов. Для приведенного примера следующие два оператора будут эквивалентными:
// Ранее, например, было определено int First = 0;
*New = First; Next = First;
Используя ссылку для более сложных типов данных можно производить быстрое копирование объектов:
struct R {
char L[20];
int Numb;
};
struct R First, Second;
struct R &New = Second;
void main( )
{
First. Numb = 10;
New = First; // Скопируется вся структура
}
Ссылки удобно использовать в качестве параметров и возвращаемых значений в функциях.
При программировании конструкторов существует специальный тип конструкторов, использующий ссылки. Такие конструкторы называются конструкторами копирования-инициализации. Например, конструктор может создавать новый объект, копируя данные из старого объекта:
class MyOwn {
int Leng;
public:
MyOwn ( int L ) { Leng = L };
MyOwn ( MyOwn& );
};
MyOwn::MyOwn( MyOwn& Old )
{
Leng = Old.Leng;
}
3. Деструкторы классов
инициализация программа конструктор деструкция
Для выполнения действий, обратных совершаемым конструкторами, т.е., например, освобождение заказанной памяти, закрытие открытых конструктором файлов и т.п., в С++ введен механизм деструкторов. Деструктор класса вызывается автоматически для каждого из объектов класса при потере его из области видимости в программе. Это происходит при выходе программы из блока, в котором определен объект класса. Существование блока легко определяется по фигурным скобкам, открывающим и закрывающим каждый из блоков. Если объект класса определен глобально, например, перед функцией main(), деструктор для этого объекта будет вызван в самом конце программы.
Если для класса X конструктор класса называется X, то его деструктор называется ~X.
Чаще всего конструкторы и деструкторы классов используют стандартные операции С++ для заказа и освобождения динамически распределяемой оперативной памяти, соответственно new и delete.
Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. В следующих уроках вы узнаете, как создать списки объектов, которые увеличиваются или уменьшаются по мере выполнения программы. Чтобы создать такие динамические списки, ваша программа для хранения объектов распределяет память динамически (что вы еще не научились делать). К настоящему моменту вы можете создавать и уничтожать объекты в процессе выполнения программы. В таких случаях имеет смысл применение деструкторов.
Каждая из созданных до сих пор программ создавала объекты в самом начале своего выполнения, просто объявляя их. При завершении программ C++ уничтожал объекты. Если вы определяете деструктор внутри своей программы, C++ будет автоматически вызывать деструктор для каждого объекта, когда программа завершается (т.е. когда объекты уничтожаются). Подобно конструктору, деструктор имеет такое же имя, как и класс объекта.
Деструктор представляет собой функцию, которую C++ автоматически запускает, когда он или ваша программа уничтожает объект. Деструктор имеет такое же имя, как и класс объекта; однако вы предваряете имя деструктора символом тильды (~), например ~employee. В своей программе вы определяете деструктор точно так же, как и любой другой метод класса.
В качестве примера рассмотрим некоторый класс String:
#include "iostream.h"
#include "string.h"
class String {
char *QuoteString;
int StringLength;
public:
String ( char * ); // Конструктор
~String ( ); // Деструктор
};
String::String ( char *InitString )
{
QuoteString = new char[strlen(InitString)+1];
strcpy(QuoteString, InitString);
if (!QuoteString)
cout << "Недостаточно памяти!";
StringLength = strlen(QuoteString);
}
String::~String( ) // Освобождение памяти
{
cout << "Строка" << QuoteString;
delete QuoteString;
QuoteString = (char *) 0;
cout << "Освобождена\n";
}
void main( )
{
String First("Первая строка"); // Вызов конструктора First
{
String Second("Вторая строка"); // Вызов конструктора
// для Second
// Операторы программы
} // Вызов деструктора
// для Second
// Операторы программы
} // Вызов деструктора
// для First
Результатом работы этой программы будет следующее сообщение:
СтрокаПервая строкаОсвобождена
СтрокаВторая строкаОсвобождена
4. Пpимеp программы с конструкторами и деструкторами
Продолжим выполнение задания из примера предыдущей главы для объектов класса "Комплексные числа" в части программирования конструкторов и деструкторов:
/*********************/
/* Constructors & */
/* Destructors of */
/* class Complex */
/*********************/
/* v.25.12.2002 */
#include "iostream.h" // Для cin, cout см.последующие главы
class Complex {
float Re; // Действительная и
float Im; // мнимая части числа
public:
Complex ( );
Complex ( int, int );
~Complex ( );
// Функции арифметики
void Put ( ); // Функция ввода
};
void Complex::Put ( ) // Вывод на экран
{
cout << "Действительная часть числа: " << Re;
cout << "\nМнимая часть числа: " << Im;
}
Complex::Complex(int R, int I)
{
Re = R; Im = I;
}
Complex::Complex( )
{
Re = Im = 0;
}
Complex::~Complex( )
{
Re = 0; Im = 0;
}
void main( )
{
{
Complex a,b; // Определение объектов a,b
Complex c(12,24); // Определение объекта c
a.Put( ), b.Put( ),c.Put ( ); // Вывод на экран
}
}
Заключение
Конструкторы и деструкторы представляют собой специальные функции класса, которые программа автоматически вызывает при создании или уничтожении объекта. Большинство программ используют конструктор для инициализации элементов данных класса. Простые программы, создаваемые сейчас вами, вероятно, не потребуют использования деструктора. Другими словами, вы можете переопределить символ плюс таким образом, что он будет добавлять содержимое одной строки к другой. Как вы уже знаете, тип (например, char, float и int) определяет набор значений, которые может хранить переменная, и набор операций, которые ваши программы могут выполнять над этой переменной. Когда вы определяете класс, вы по существу определяете тип. C++ позволяет вам указать, как ведут себя операторы с данным типом. До изучения урока 24 убедитесь, что освоили следующие основные концепции:
Конструктор представляет собой специальную функцию, которую ваша программа автоматически вызывает каждый раз при создании объекта. Конструктор имеет такое же имя, как и класс объекта.
Конструктор не имеет возвращаемого значения, но вы не указываете ему тип void. Вместо этого вы просто не указываете возвращаемое значение вообще.
Когда ваша программа создает объект, она может передать параметры конструктору во время объявления объекта.
C++ позволяет вам перегружать конструкторы и разрешает использовать значения по умолчанию для параметров.
Деструктор представляет собой специальную функцию, которую ваша программа вызывает автоматически каждый раз при уничтожении объекта. Деструктор имеет такое же имя, как и класс объекта, но его имя предваряется символом тильды (~).
Список литературы
1. Джарод Холингвэрт, Дэн Баттерфилд, Боб Сворт, Джэйми Оллсоп C++Builder 5. Руководство разработчика.
2. Borland C++ Builder 5. Энциклопедия программиста. Калверт Ч., Рейсдорф К., "ДиаСофт" - 2001, 944 стр.
3. http://www.codenet.ru/
4. В.В. Подбельский. Язык C++: Учебное пособие. - Москва: Финансы и статистика, 1995. 560с.
5. Ирэ Пол. Объектно-ориентированное программирование с использованием C++: Пер. с англ. - Киев: НИИПФ ДиаСофт Лтд, 1995. 480с.
6. Т. Фейсон. Объектно-ориентированное программирование на Borland C++ 4.5: Пер. с англ. - Киев: Диалектика, 1996. 544с.
Размещено на Allbest.ru
Подобные документы
Динамическая инициализация объектов в Java с помощью зарезервированного слова new. Порядок вызовов при создании объекта. Порядок выполнения операторов при наличии блоков инициализации. Чтение и запись файлов в программе, иерархия классов ввода/вывода.
контрольная работа [120,6 K], добавлен 07.06.2011Механизм классов в C++. Инициализация внутреннего объекта с помощью конструктора. Управление доступом к классу. Защищенные члены класса. Графические средства компилятора Borland C 3.1. Библиотека стандартных шаблонов. Реализация и использование класса.
курсовая работа [2,7 M], добавлен 16.05.2012Коды, обрабатывающие исключения, информация о причине их возникновения. Способы обработки исключений. Механизмы обработки исключений. Инициализация ссылки на объект. Конструкторы стандартных исключений. Автоматическая и программная генерации исключений.
презентация [126,1 K], добавлен 21.06.2014Основные понятия объектно-ориентированного программирования в PHP5. Структурный и объектно-ориентированный подход. Класс как абстрактный тип. Реализация класса. Конструкторы и деструкторы. Функция l_visited_style изменение стиля посещенных ссылок.
курсовая работа [433,2 K], добавлен 13.06.2008Строение класса complex. Примеры использования класса complex. Результат выполнения программы. Цикл возведения первого числа во второе. Операции с комплексными числами. Конструкторы и операции присваивания для типа complex. Неявные преобразования типов.
курсовая работа [1,5 M], добавлен 18.05.2011Понятие доступности элементов класса и объекта. Обращение к полям на основе общедоступных свойств (инкапсуляция на основе свойств класса). Способы передачи данных в метод и возвращения результатов работы метода. Обращение к полям и свойствам класса.
презентация [86,6 K], добавлен 09.12.2013Описание структурного шаблона с именем ZNAK, содержащего элементы NAME, ZODIAC, BDAY. Операции со структурами в языке Си. Подключение графической библиотеки программы. Указатель как переменная, содержащая адрес некоторого объекта в памяти компьютера.
контрольная работа [342,9 K], добавлен 10.01.2012Алгоритм составления шаблонов имен при поиске файлов. Описание и функции объекта "Мой компьютер". Способы выделения группы файлов. Назначение кнопок на панели инструментов в программе "Проводник". Копирование в буфер обмена. Функции электронной почты.
контрольная работа [59,8 K], добавлен 18.06.2015Свойства объектно-ориентированного языка программирования. Понятия инкапсуляции и наследования. Виртуальные функции и полиморфизм. Инициализация экземпляра объекта с помощью конструктора. Динамическое создание объектов. Совместимость объектных типов.
реферат [17,0 K], добавлен 15.04.2015Цели объектно-ориентированного программирования, абстрактные классы и адреса базовых классов, множественное и виртуальное наследование. Инициализация элементов производного класса, программный вызов конструкторов базового и производного классов.
реферат [21,8 K], добавлен 31.10.2011