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.