КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Функции-члены типа static и const
Статические члены Деструкторы Некоторым классам требуется функция, которая гарантированно вызывается при уничтожении объекта (для закрытия файла, снятия блокировки и т.д.). Такие функции называются деструкторами. Имя деструктора – это имя конструктора с предшествующим символом «тильда»:
~stack3(){delete[] s};
Члены данных могут быть объявлены с использованием модификатора класса памяти static. Член данных, объявленный как static, разделяется всеми объектами своего класса и хранится в одном месте. Нестатические члены данных создаются для каждого экземпляра (т.е. объекта) класса. Если бы не наличие статических членов данных, сведения, необходимые всем экземплярам класса, должны были бы объявляться глобальными. Это разорвало бы отношения между данными и их классом. Статический член позволяет данным класса, которые не специфичны для отдельного экземпляра, существовать в области видимости класса. Так как статический член данных не зависит от конкретного экземпляра, к нему можно обращаться без указания объекта: имя_класса:: идентификатор Здесь используется оператор разрешения области видимости.
Пример: <сначала how_many_, затем how_many(), затем const max_len_>
//stat.h class stack_stat { public: stack_stat(); ~stack_stat(); ... bool is_full()const; static int how_many(); private: static const int max_len_=100; int top; char s[max_len_]; static int how_many_; };
//stat.cpp #include "stat.h" #include <cassert>
int stack_stat::how_many_=0;
stack_stat::stack_stat():top(0){++how_many_;} stack_stat::~stack_stat(){--how_many_;}
...
bool stack_stat::is_full()const {return top==max_len_;}
int stack_stat::how_many(){return how_many_;}
//use.cpp #include "stat.h" #include <iostream> using namespace std; void use_stack_stat() { stack_stat *ps=new stack_stat(); stack_stat s; // cout<<stack_stat::max_len()<<'\n'; cout<<stack_stat::how_many(); // ps->~stack_stat(); char str[]="Using Stack!!!"; int i=0; cout<<str<<endl;
while(str[i]) ps->push(str[i++]); //*ps=reverse_order(*ps); while(!ps->is_empty()) cout<<ps->pop(); cout<<endl; // s.pop(); delete ps; cout<<stack_stat::how_many();
}
В этом примере в переменной how_many отслеживается, сколько объектов класса stack_stat было создано.
C++ позволяет использовать функции-члены типа static и const. Синтаксически статическая функция-член содержит модификатор static, предшествующий возвращаемому типу функции внутри объявления класса. Определение вне класса не должно включать этот модификатор: <пример с stat1> Синтаксически, функция-член типа const вводится модификатором const, следующим за списком аргументов внутри объявления класса. Определение вне класса также должно включать этот модификатор: <Пример из stack3> Обычная функция-член может и читать, и изменять члены данных объекта. Константная функция-член может читать, но не может изменять члены данных объекта. То есть такая функция не изменяет состояние объекта. Статической функции-члену недоступны члены данных объекта, но доступны статические члены класса.
Константную функцию-член можно вызвать как для константного, так и для неконстантного объекта, в то время как неконстантную функцию-член можно вызвать только для объекта, не являющегося константой. Например:
class complex{ double re,im; public: double real()const{return re;} double real_bad_version(){return re;} } void f(){ const complex c1(1,0); complex cx(2,3); cout<<c1.real()<<cx.real();//ok cout<<c1.real_bad_version();//не скомпилируется cout<<cx.real_bad_version();//ok }
Дата добавления: 2014-01-11; Просмотров: 537; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |