Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет38/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   34   35   36   37   38   39   40   41   ...   256
1.4 Поддержка абстракции данных 
Поддержка программирования с абстракцией данных в основном сводится к возможности определить 
набор операций (функции и операции) над типом. Все обращения к объектам этого типа 
ограничиваются операциями из заданного набора. Однако, имея такие возможности, программист скоро 
обнаруживает, что для удобства определения и использования новых типов нужны еще некоторые 
расширения языка. Хорошим примером такого расширения является перегрузка операций. 
1.4.1 Инициализация и удаление 
Когда представление типа скрыто, необходимо дать пользователю средства для инициализации 
переменных этого типа. Простейшее решение – до использования переменной вызывать некоторую 
функцию для ее инициализации
Например: 
class vector 

// 
... 
public: 
void init ( init size ); 
// 
вызов init () перед первым 
// использованием объекта vector 
// 
... 
}; 
void f () 

vector 
v; 
// пока v нельзя использовать 
v.init ( 10 ); 
// теперь можно 

Но это некрасивое и чреватое ошибками решение. Будет лучше, если создатель типа определит для 
инициализации переменных некоторую специальную функцию. Если такая функция есть, то две 
независимые операции размещения и инициализации переменной совмещаются в одной (иногда ее 
называют инсталляцией или просто построением). Функция инициализации называется конструктором. 
Конструктор выделяется среди всех прочих функций данного класса тем, что имеет такое же имя, как и 
сам класс. Если объекты некоторого типа строятся нетривиально, то нужна еще одна дополнительная 
операция для удаления их после последнего использования. Функция удаления в С++ называется 
деструктором. Деструктор имеет то же имя, что и его класс, но перед ним стоит символ ~ (в С++ этот 
символ используется для операции дополнения). Приведем пример: 
class vector 

int sz;
// число элементов 
int * v;
// указатель на целые 
public: 
vector ( int ); 
// 
конструктор 
~vector 
(); 
// деструктор 
int& operator [] ( int index )
; // операция индексации 
}; 
Конструктор класса vector можно использовать для контроля над ошибками и выделения памяти: 
vector::vector ( int s ) 

if ( s <= 0 ) 
error ( "недопустимый размер вектора" ); 
sz = s; 
v = new int [ s ]; 
// разместить массив из s целых 



Бьерн Страуструп.
Язык программирования С++ 
 
36 
Деструктор класса vector освобождает использовавшуюся память: 
vector::~vector () 

delete [] v; 
// освободить массив, на который 
// настроен указатель v 

От реализации С++ не требуется освобождения выделенной с помощью new памяти, если на нее 
больше не ссылается ни один указатель (иными словами, не требуется автоматическая "сборка 
мусора"). В замен этого можно без вмешательства пользователя определить в классе собственные 
функции управления памятью. Это типичный способ применения конструкторов и деструкторов, хотя 
есть много не связанных с управлением памятью применений этих функций (см., например, $$9.4). 


Достарыңызбен бөлісу:
1   ...   34   35   36   37   38   39   40   41   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет