Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / C / C++ / Введение в язык C++ / Классы /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Классы и Члены - Программирование от RIN.RU
Классы и Члены



Очистка


Определяемый пользователем тип чаще имеет, чем не имеет, конструктор, который обеспечивает надлежащую инициализацию. Для многих типов также требуется обратное действие, деструктор, чтобы обеспечить соответствующую очистку объектов этого типа. Имя деструктора для класса X есть ~X() ("дополнение конструктора"). В частности, многие типы используют некоторый объем памяти из свободной памяти (см. этот раздел), который выделяется конструктором и освобождается деструктором. Вот, например, традиционный стековый тип, из которого для краткости полностью выброшена обработка ошибок:


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; }
char pop() { return *--top;}
}


Когда char_stack выходит из области видимости, вызывается деструктор:


void f()
{
char_stack s1(100);
char_stack s2(200);
s1.push("a");
s2.push(s1.pop());
char ch = s2.pop();
cout << chr(ch) << "\n";
}


Когда вызывается f(), конструктор char_stack вызывается для s1, чтобы выделить вектор из 100 символов, и для s2, чтобы выделить вектор из 200 символов. При возврате из f() эти два вектора будут освобождены.


Inline


При программировании с использованием классов очень часто используется много маленьких функций. По сути, везде, где в программе традиционной структуры стояло бы просто какое-нибудь обычное использование структуры данных, дается функция. То, что было соглашением, стало стандартом, который распознает компилятор. Это может страшно понизить эффективность, потому что стоимость вызова функции (хотя и вовсе не высокая по сравнению с другими языками) все равно намного выше, чем пара ссылок по памяти, необходимая для тела функции.


Чтобы справиться с этой проблемой, был разработан аппарат inline- функций. Функция член, определенная (а не просто описанная) в описании класса, считается inline. Это значит, например, что в функциях, которые используют приведенные выше char_stack, нет никаких вызовов функций кроме тех, которые используются для реализации операций вывода! Другими словами, нет никаких затрат времени выполнения, которые стоит принимать во внимание при разработке класса. Любое, даже самое маленькое действие, можно задать эффективно. Это утверждение снимает аргумент, который чаще всего приводят чаще всего в пользу открытых членов данных.


Функцию член можно также описать как inline вне описания класса.


Например:


char char_stack {
int size;
char* top;
char* s;
public:
char pop();
// ...
};


inline char char_stack::pop()
{
return *--top;
}


<<<  Назад
 1  2  3  4 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Знакомство и краткий обзор

Интерфейсы и Реализации

Друзья и Объединения

Конструкторы и Деструкторы

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь