|
|
|
|
|
для: oleg_alexeev
(19.03.2007 в 16:18)
| | >На начальном этапе обучения можно запомнить это в качестве правила - нельзя самому вызывать
>конструктор и деструктор.
Нужно вызывать конструктор явно,хотя бы для того чтобы потом не делать кучу вызовов типа
| |
|
|
|
|
|
|
|
для: alex19921992
(19.03.2007 в 15:48)
| | Конечно можно. Но это уже больше похоже на стиль языка Си. В большой программе окажется, что
код, работающий с внутренними данными объектов будет разбросан по разным местам и, при
внесении изменений в структуру объекта придется вносить изменения во множество мест. На
практике стараются сделать объекты и их методы такими, чтобы при изменении структуры объекта
поменялись только его методы, но не код, использующий эти объекты. | |
|
|
|
|
|
|
|
для: oleg_alexeev
(19.03.2007 в 14:26)
| | То есть я могу сделать конструктор и деструктор пустыми и заботиться обо всем сам? | |
|
|
|
|
|
|
|
для: alex19921992
(19.03.2007 в 14:05)
| | Нет, не надо. Более того - нельзя самому вызывать деструктор объекта. Вызов конструктора и
деструктора генерируется компилятором автоматически при объявлении объекта на стеке или
при создании и удалении его в глобальной памяти операторами new и delete.
На начальном этапе обучения можно запомнить это в качестве правила - нельзя самому вызывать
конструктор и деструктор.
На самом деле вызывать их самому можно, но только в очень специфическом случае. Не буду
про него сейчас говорить, дабы не усложнять тему. | |
|
|
|
|
|
|
|
для: oleg_alexeev
(19.03.2007 в 11:53)
| | Но по идее при удалении объекта из очереди надо в самом конце вызвать деструктор? | |
|
|
|
|
|
|
|
для: alex19921992
(19.03.2007 в 11:19)
| | >> Так что же значит слово virtual?
Это ключевое слово означает, что данная функция вызывается не непосредственно, а через
указатель, который находится внутри объекта. Когда функция Create создает объект типа Derived1
оператором new, то он помещает в объект указатель на ~Derived1 (для Derived2 - соответственно
на ~Derived2). После использования объектов мы их удаляем оператором delete. Он считывает из
объекта указатель на деструктор и вызывает именно тот деструктор, который соответствует типу
объекта (~Derived1 или ~Derived2).
Base *pobj = Base::Create();
pobj->Draw(); // нарисуется нужная фигура (если Draw виртуальная функция)
delete pobj; // здесь вызовется именно нужный деструктор
|
Такой прием программирования называется полиморфизмом (изменение поведения в
производном классе)
>> Вот я знаю, что конструктор инициализирует объект, т.е. дает начальные значения переменным,
>> ну и если объект динамический, то выделяет память под него. А деструктор? Только удалить
>> память и перенаправить указатели в очереди?
Деструктор только освобождает занятые объектом ресурсы, такие как выделенная память (когда
в объекте есть указатели и память выделяется при вызове конструктора или где-то в процессе
работы), дескрипторы файлов, сокетов и т.п.
Если объект входит в какие-либо списки или очереди, то изменение указателей в них - это не
задача деструктора, а задача функции удаления элемента из этой структуры данных. | |
|
|
|
|
|
|
|
для: alex19921992
(19.03.2007 в 11:19)
| | > Так что же значит слово virtual?
Суть такая: если в базовом классе есть функции, объявленные с virtual (необязательно конструктор/деструктор), а в подклассе они переопределены, то если вызвать этот метод базового класса, то на этапе исполнения будет решаться, метод какого класса (базового или кого-то из наследников) будет вызван (полиморфизм, позднее связывание - знакомы?) Для ясности пример:
struct Base
{
virtual void showMessage()
{
fprintf(stdout,"Message from Base!");
}
};
struct SubClass : public Base
{
virtual void showMessage()
{
fprintf(stdout,"Message from Subclass");
}
};
void alert(Base* o)
{
o->showMessage();
}
/* ... */
Base* b = new Base;
SubClass* s = new SubClass;
alert(b);
alert(s);
}
|
Будет выведено:
Message from Base!
Message from subclass
В случае с вашими классами это будет нужно для корректной работы деструктора в завизимости от подкласса, если вы все объекты будете обрабатывать как Base | |
|
|
|
|
|
|
|
для: Фитч
(19.03.2007 в 09:20)
| | Вот я знаю, что конструктор инициализирует объект, т.е. дает начальные значения переменным, ну и если объект динамический, то выделяет память под него. А деструктор? Только удалить память и перенаправить указатели в очереди?(если объект динамический).
Так что же значит слово virtual? | |
|
|
|
|
|
|
|
для: alex19921992
(19.03.2007 в 09:05)
| | 1. struct и class на деле отличаются в основном уровнем доступа по умолчанию (public для struct и private для class). Struct - объявление в стиле СИ, оно используется достаточно часто
2. Деструкторы лучше делать виртуальными, чтобы при уничтожении объекта был вызван именно деструктор подкласса, а не родителя. | |
|
|
|
|
|
|
|
для: oleg_alexeev
(18.03.2007 в 19:32)
| | принцип в общем понятен, спасибо.
но есть некоторые неясности...
слово virtual перед деструктором - это обязательно? что значит это слово? И вот struct Derived2 : public Base - типа public - это предок, да? и наверно не структ, а класс? | |
|
|
|
|