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



Pdf көрінісі
бет103/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   99   100   101   102   103   104   105   106   ...   256
5.2.5 Удаление 
Пользовательские типы чаще имеют, чем не имеют, конструкторы, которые проводят надлежащую 
инициализацию. Для многих типов требуется и обратная операция - деструктор, гарантирующая 
правильное удаление объектов этого типа. Деструктор класса X обозначается ~X ("дополнение 
конструктора"). В частности, для многих классов используется свободная память (см. $$3.2.6), 
выделяемая конструктором и освобождаемая деструктором. Вот, например, традиционное определение 
типа стек, из которого для краткости полностью выброшена обработка ошибок: 
class char_stack { 
int 
size; 
char* 
top; 
char* 
s; 
public: 
char_stack(int sz) { top=s=new char[size=sz]; } 
~char_stack() { delete[] s; } // 
деструктор 
void push(char c) { *top++ = c; } 
void pop() { return *--top; } 
}; 
Когда объект типа char_stack выходит из текущей области видимости, вызывается деструктор: 


Бьерн Страуструп.
Язык программирования С++ 
 
129 
void f() 

char_stack 
s1(100); 
char_stack 
s2(200); 
s1.push('a'); 
s2.push(s1.pop()); 
char ch = s2.pop(); 
cout << ch << '\n'; 

Когда начинает выполняться f(), вызывается конструктор char_stack, который размещает массив из 100 
символов s1 и массив из 200 символов s2. При возврате из f() память, которая была занята обоими 
массивами, будет освобождена. 
5.2.6 Подстановка 
Программирование с классами предполагает, что в программе появится множество маленьких функций. 
По сути, всюду, где в программе с традиционной организацией стояло бы обычное обращение к 
структуре данных, используется функция. То, что было соглашением, стало стандартом, проверяемым 
транслятором. В результате программа может стать крайне неэффективной. Хотя вызов функции в C++ 
и не столь дорогостоящая операция по сравнению с другими языками, все-таки цена ее много выше, 
чем у пары обращений к памяти, составляющих тело тривиальной функции. 
Преодолеть эту трудность помогают функции-подстановки (inline). Если в описании класса функция-
член определена, а не только описана, то она считается подстановкой. Это значит, например, что при 
трансляции функций, использующих char_stack из предыдущего примера, не будет использоваться 
никаких операций вызова функций, кроме реализации операций вывода! Другими словами, при 
разработке такого класса не нужно принимать во внимание затраты на вызов функций. Любое, даже 
самое маленькое действие, можно смело определять как функцию без потери эффективности. Это 
замечание снимает наиболее часто приводимый довод в пользу общих членов данных. 
Функцию-член можно описать со спецификацией inline и вне описания класса: 
class char_stack { 
int 
size; 
char* 
top; 
char* 
s; 
public: 
char 
pop(); 
// 
... 
}; 
inline char char_stack::pop() 

return 
*--top; 

Отметим, что недопустимо описывать разные определения функции-члена, являющейся подстановкой, 
в различных исходных файлах ($$R.7.1.2). Это нарушило бы понятие о классе как о цельном типе


Достарыңызбен бөлісу:
1   ...   99   100   101   102   103   104   105   106   ...   256




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

    Басты бет