• За всеки обект се викат точно по един път конструктор и деструктор
  • Има много начини да се създаде един обект с конструктор, но той може да се унищожи само по един начин
  • Конструкторите на обект се извикват при:
    • явно статично дефиниране на променлива в: Object a(4,"aaa");
    • явно извикване на конструктора: Object(4,"aaa") - създава се временен обект
    • създаване на обект в динамичната памет с конструиране: Object* p = new Object(4,"aaa")
    • извикване на конструктор на обект, който е член-данна в инициализиращия списък на конструктор: class BigObject { Object a; public: BigObject(int x) : a(x,"aaa") {...} ... };
    • конструктор по подразбиране се вика при:
      • Статично дефиниране на обект без инициализация: Object a;
      • Създаване на обект в динамичната памет без инициализация: Object* p= new Object;
      • Създаване на статичен масив от обекти: Object array[15];
      • Създаване на динамичен масив от обекти: Object *array = new Object[x];
    • конструктор за копиране се извиква при:
      • Инициализация с копиране от друг обект: Object a = b;
      • Предаване на обект като параметър-стойност на функция: void f(Object x) {...} ... f(a);
      • Връщане на обект като резултат от функция: Object f() {Object a(4,"aaa"); return a;}
    • Статична инициализация от вида Object a = b; се превежда до Object a(b) независимо от какъв тип е b. Например ако имаме конструктор Object(int x), то инициализацията Object a = 3; ще извика този конструктор.
  • Деструкторите служат за довършителни операции, евентуално освобощдаване на заета от обекта динамична памет.
  • Деструкторите се извикват при:
    • излизане от блок или функция, където е заделен даден обект
    • извикване на оператор delete за динамично заделен обект
    • извикване на оператор delete[] за динамично заделен масив от обекти с new[...]
      • Внимание: Ако извикате delete за заделен масив от обекти, то ще се извика деструктор само на първия обект
    • унищожаване на обект, в който съдържа член-данна друг обект
    • завършване на функция за всички параметри, които са обекти, предадени по стойност
    • унищожаване на временен обект (върнат като резултат от функция или създаден с явно извикване на конструктор от вида Object(4,"aaa"))
      • Временните обекти се унищожават, когато компилаторът сметне, че те вече не са нужни
    • завършване на програмата за глобално дефинирани обекти
Последно модифициране: събота, 12 ноември 2011, 17:38