Как проверить переменую-экземпляр класса

Вопросы по языкам программирования Си и С++.
VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Как проверить переменую-экземпляр класса

Сообщение VBTerminator » 24.02.2012 (Пт) 9:42

Всем добрый день!

Как проверить, привязана ли переменная, объявленная как CMyClass MyClassVar к какому-либо экземпляру класса, чтобы было что-то наподобие if( lpPointer != NULL ) для указателей?

И ещё. Как очистить эту переменную при запуске программы, чтобы она ни на что не ссылалась (а то при выделении памяти в этом "указателе" может оказаться мусор)?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как проверить переменую-экземпляр класса

Сообщение Хакер » 24.02.2012 (Пт) 10:12

Ерунда.
Никак не проверить. Никак не очистить.

Это не указатель на экземпляр класса. Это сам экземпляр класса. Он всегда есть, когда жива переменная.

Это всё равно, что User-Defined-Type в VB:

Код: Выделить всё
Dim x As My_UDT

Как проверить, что x ссылается на экземпляр My_UDT? Да никак, потому что нет никакого ссылания. x — сам по себе является большой переменной, хранящей «контект» My_UDT.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Как проверить переменую-экземпляр класса

Сообщение VBTerminator » 24.02.2012 (Пт) 10:32

То есть, если я правильно понимаю, экземпляр класса создаётся автоматически при объявлении переменной, а строка m_Class = CMyClass(); всего лишь вызывает конструктор для задания начальных значений членов-переменных класса?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как проверить переменую-экземпляр класса

Сообщение Хакер » 24.02.2012 (Пт) 11:18

VBTerminator писал(а):То есть, если я правильно понимаю, экземпляр класса создаётся автоматически при объявлении переменной,


Код: Выделить всё
double aaa;
float bbb;

Создаются ли экземпляры двух чисел автоматически при объявлении?

VBTerminator писал(а):а строка m_Class = CMyClass(); всего лишь вызывает конструктор для задания начальных значений членов-переменных класса?

Нет, это вообще глупость. В этом случае (если m_Class объявлен как CMyClass m_Class) конструктор будет вызван два раза. Один раз при входе в «зону видимости» переменной, второй раз на строке m_Class = CMyClass() (и тут же будет вызван деструктор для только что созданного на стеке объектика).


Блин, просто скомпилируй и посмотри:
Код: Выделить всё
#include <stdio.h>

class Object
{
public:
   const char* my_tag;
   Object(const char* tag);
   ~Object();
};

Object::Object(const char* tag)
{
   my_tag = tag;
   printf("  + Constructor with tag [%s], this instance address=%x.\n", my_tag, this);
}

Object::~Object()
{
   printf("  - Destruction of [%s], this instance address=%x\n", my_tag, this);
}



Object var_dog("Dog! Gav-Gav!");
Object var_cat("Cat! Myau!");
Object var_bird("Twi-ty-ty-ty!");

void main()
{
   printf("Just before [main] enterance.\n");
   
   Object man("Jack");
   Object woman("Lola");
   
   printf("Just after two vars defined.\n");
   
   
   woman = Object("FUGAS");

   printf("Just after stupid assignment.\n");

   Object* pStrange = new Object("StrangeObject");

   printf("Just before return.\n");

   return;
}


Вывод программы:
Код: Выделить всё
  + Constructor with tag [Dog! Gav-Gav!], this instance address=40aa2c. // Секция данных
  + Constructor with tag [Cat! Myau!], this instance address=40aa28. // Секция данных
  + Constructor with tag [Twi-ty-ty-ty!], this instance address=40aa30. // Секция данных
Just before [main] enterance.
  + Constructor with tag [Jack], this instance address=12ff78. // На стеке
  + Constructor with tag [Lola], this instance address=12ff74. // На стеке
Just after two vars defined.
  + Constructor with tag [FUGAS], this instance address=12ff70. // На стеке
  - Destruction of [FUGAS], this instance address=12ff70 // На стеке
Just after stupid assignment.
  + Constructor with tag [StrangeObject], this instance address=3307e0. // В куче
Just before return.
  - Destruction of [FUGAS], this instance address=12ff74
  - Destruction of [Jack], this instance address=12ff78
  - Destruction of [Twi-ty-ty-ty!], this instance address=40aa30
  - Destruction of [Cat! Myau!], this instance address=40aa28
  - Destruction of [Dog! Gav-Gav!], this instance address=40aa2c


Как видишь, конструктор для не-локальных var_dog, var_cat, var_bird вызывается до входа в main, а деструктор — после выхода из main. «Инстансы», как ты их называешься, приходятся на секцию данных и существуют в памяти вечно.

Обрати внимание, что созданный объект ФУГАС сразу же уничтожился, но перед этим был склонирован в переменную woman, поэтому мы не видим уничтожения Лолы.

Обрати внимания, что экземпляр, который был создан через new (и указатель на который был присвоен переменной pStrange) не уничтожился, потому что нужно явно делать delete.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList