#include
using namespace std;
2 :
class MonsterDB
{
private:
-MonsterDB() {}; // закрытый деструктор
public:
static void Destroylnstance(MonsterDB* plnstance)
1 0 :
|
{
|
1 1 :
|
// статический член класса может обратиться к закрытому
|
12
|
// деструктору
|
delete plnstance;
|
13
|
|
14
|
|
// ... несколько других методов
int main ()
MonsterDB* pMyDatabase = new MonsterDB();
pMyDatabase -> member methods
снимите комментирий со следующих строк, чтобы получить
ошибку при компиляции
delete pMyDatabase; // закрытый деструктор не может быть
вызван
для освобождения используйте статический метод MonsterDB::Destroylnstance(pMyDatabase);
return 0;
}
Этот фрагмент кода не имеет вывода.
Анализ
Цель кода — продемонстрировать, что класс, запрещающий создание своих экземпля р е в стеке, нуждается в закрытом деструкторе, как показано в строке 6, и статической оункции D e s t r o y l n s t a n c e (), как показано в строках 9 -13, используемой в функции - a m () (строка 28).
Указатель this
Указатель t h i s — это важнейшая концепция языка C++; зарезервированное ключе-зое слово t h i s применимо в рамках класса, который содержит адрес объекта. Другими словами, значение указателя t h i s — это & o b je c t. В пределах метода класса, когда вы вызываете другой метод, компилятор неявно передает ему в вызове указатель t h i s как невидимый параметр:
class Human
{
private:
... объявления закрытых членов void Talk (string Statement)
{
cout « Statement;
} !
public:
void IntroduceSelf ()
{
Talk("Bla bla");
}
};
Здесь представлен метод I n t r o d u c e S e l f (); использующий закрытый член T a lk () хтя вывода на экран выражения. В действительности компилятор внедряет указатель t h i s в вызов метода T a lk (), который выглядит как T a lk ( t h i s , "B la b l a " ).
точки зрения программирования у указателя t h i s не слишком много областей при менения, но иногда он оказывается удобным. Например, у кода доступа к переменной Аде в пределах функции S e t Аде (), представленной в листинге 9.1, может быть такой вариант:
238
|
ЗАНЯТИЕ 9. Классы и объекты
|
void
|
SetAge(int
|
HumansAge)
|
{
|
this->Age = HumansAge; // то же, что и Age = HumansAge
|
|
ПРИМЕЧАНИЕ
|
Указатель this не передается в статические методы класса. Как и статические
|
|
|
функции, они не связаны с экземпляром класса. Статические методы совмест
|
|
|
но используются всеми экземплярами.
|
Если хотите использовать переменные экземпляра в статической функции, явно объявите параметр, используемый вызывающей стороной, для передачи указа теля this как аргумента.
Размер класса
Вы изучили основные принципы определения собственного типа с использованием ключевого слова c l a s s , позволяющие инкапсулировать атрибуты данных и методы, ра ботающие с этими данными. Оператор s i z e o f (), описанный на занятии 3, “Использо вание переменных, объявление констант”, используется для определения объема памяти
байтах, занимаемого переменной определенного типа. Этот оператор применим и для классов, он в основном сообщает сумму байтов, занимаемых каждым атрибутом данных, содержавшимся в пределах объявления класса. В зависимости от используемого компи лятора оператор s i z e o f () может включать или не включать для некоторых атрибутов дополнения до границ слова. Ф ункции-члены и их локальные переменные не участвуют в определении размера класса. Рассмотрим листинг 9.12.
ЛИСТИНГ 9,12. Результат применения оператора sizeof () к классам и их экземплярам
Do'stlaringiz bilan baham: |