Объектно-ориентированное программирование на C++, страница 2
Описание файла
PDF-файл из архива "Объектно-ориентированное программирование на C++", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика" в общих файлах.
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
То есть программана C++ состоит из набора cpp-файлов, каждый из которыхкомпилируется в объектный файл. Чтобы связать эти объектные файлы, применяется линкер.Так как класс в общем случае может использоваться внескольких cpp-файлах, то в каждом файле должно бытьего объявление. На практике объявление класса выноситсяв отдельный h-файл, который включается в нужные cppфайлы.Так как статическое поле – это фактически глобальная переменная, то она должна быть явно помещена в один изобъектных файлов. Для этого в соответствующем cpp-файледолжно быть дано её определение (имя статического полявыглядит как Имя_класса::Имя_поля).int Point :: count = 0;16 / 99Объявление методовБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийИсключенияОбъявление метода на C++ состоит из прототипа и определения. Прототип метода помещается в тело класса, а определение – в нужный cpp-файл (тут та же история, что исо статическими полями).
Прототипы статических методовобъявляются с модификатором static.Пример (объявление класса с прототипом метода dist):class Point{public :double x , y ;double dist ();};Пример (определение метода dist):double Point :: dist (){return sqrt ( x * x + y * y );}17 / 99Виртуальные и абстрактные методыБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийИсключенияПо умолчанию для вызова методов в C++ используетсяраннее связывание.Чтобы включить позднее связывание, в объявлении прототипа метода надо указать модификатор virtual:class Point{public :virtual double dist ();};Прототип абстрактного метода заканчивается на «= 0»:class Point{public :virtual double dist () = 0;};Класс, в котором есть абстрактный метод, автоматическистановится абстрактным.18 / 99Объявление конструкторовБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийИсключенияВ C++ объявление экземплярного конструктора, как и объявление обычного экземплярного метода, состоит из прототипа конструктора, записываемого в теле класса, и определения конструктора, размещённого в одном из cpp-файлов.В отличие от объявления метода, в объявлении конструктора имя конструктора совпадает с именем класса, и дляконструктора не указывается тип возвращаемого значения.Чтобы запретить создание экземпляра класса, достаточно объявить конструктор в private- или protected-секциикласса.
При этом, естественно, в public-секции ни одногоконструктора не должно быть объявлено.Специфика реализации конструкторов в языке C++ диктует следующий крайне нетипичный для современных языковпринцип: никогда не вызывайте из конструктора виртуальные методы – это может привести к проблемам в случае переопределения этих методов в классах-наследниках.19 / 99Пример: объявление конструкторовБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийИсключения1234567class Point{private :double x , y ;public :Point ( double x , double y );};89101112Point :: Point ( double x , double y ){this - > x = x ; this - > y = y ;}Ключевое слово this в теле метода (в том числе и конструктора) обозначает указатель на объект, для котороговызван конструктор.
Мы вынуждены использовать this длядоступа к полям объекта, так как имена параметров конструктора совпадают с именами полей.20 / 99Создание объектов в динамической памятиБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийИсключенияРассмотрим, как в C++ принято создавать объекты классов. При этом мы на данном этапе изучения C++ ограничимся созданием объектов в динамической памяти.Вообще, динамическое выделение памяти под значение любого типа выполняется в C++ операцией new, имеющей следующий синтаксис:new имя_примитивного_ тип аилиnew имя_примитивного_ тип а ( начальное_значение )илиnew имя_класса ( фактически е _п а ра м ет р ы_ к он с тр у кт о ра )Например,int * x = new int ;float * y = new float (3.14);Point * p = new Point (1.5 , 2.3);21 / 99Создание массивов в динамической памятиБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийИсключенияОперация new совмещает выделение памяти с инициализацией (с вызовом конструктора) и возвращает указатель насозданный и инициализированный объект.В C++ вообще не принято использовать функцию malloc,потому что для создания массивов также используется специальная форма операции new:new тип_элемента [ размер ]Например,int * a = new int [10];Point ** pa = new Point * [20];Обратите внимание на то, что массив объектов можно выделять только в случае, если в классе определён конструкторпо умолчанию.
При этом этот конструктор будет вызвандля каждого объекта в массиве.Point * b = new Point [20]; // ошибка22 / 99Удаление объектов и массивовБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийТак как в C++ не предусморено автоматическое управлениепамятью (нет сборщика мусора), то все объекты, созданныеоперацией new, должны быть в какой-то момент явно освобождены.Для этого существует оператор delete, имеющий следующий синтаксис:delete указатель_на_объект ;// для объектовdelete [] указатель_на_массив ; // для массивовНапример,Point * p = new Point (10.0 , 20.0);delete p ;int * a = new int [20];delete [] a ;Исключения23 / 99Объявление деструктораБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийВнутреннее состояние объекта может содержать указатели(ссылки) на другие объекты, созданные в его конструкторе.В языке без сборки мусора освобождение такого объектаможет привести к утечке памяти.Деструктор – это экземплярный метод, предназначенныйдля освобождения ресурсов, принадлежащих объекту, непосредственно перед уничтожением этого объекта.В языке C++ деструкторы жизненно необходимы.
Прототип деструктора имеет вид~ имя_класса ();Деструктор вызывается при уничтожении объекта. В частности, его автоматически вызывает оператор delete.Исключения24 / 99Пример: объявление деструктораБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследование123456789class IntArray {private :int * a ;int n ;public :IntArray ( int n );int & at ( int i );virtual ~ IntArray ();};10Множественноенаследование11Обобщённоепрограммирование1312IntArray :: IntArray ( int n ): n ( n ) { a = new int [ n ]; }int & IntArray :: at ( int i ) { return a [ i ]; }IntArray ::~ IntArray () { delete [] a ; }ПерегрузкаоперацийИсключения25 / 99Объекты в автоматической памятиБазовыесведенияВведениеСсылкиКлассыПоля и методыКонструкторыСоздание иуничтожениеобъектовКопированиеобъектовОдиночноенаследованиеМножественноенаследованиеОбобщённоепрограммированиеПерегрузкаоперацийИсключенияВ отличие от языка Java, в C++ объекты могут размещаться в глобальных и локальных переменных, в параметрахметодов, в элементах массивов и полях других объектов.Синтаксис объявления переменной, содержащей объект, выглядит какимя_класса имя_переменной ( параметры_конст ру кт ор а );Такие объявления, кстати, можно применять и для переменных, тип которых не является классом.Примеры:IntArray a (100);Point p (10.5 , 15.0);int i (666);const char * s ( " qwerty " );Объявление переменной, содержащей объект, вызывает экземплярный конструктор класса.