Конструктор (обектно ориентирано програмиране): Разлика между версии

Изтрито е съдържание Добавено е съдържание
Mishobg12 (беседа | приноси)
Редакция без резюме
Mishobg12 (беседа | приноси)
Редакция без резюме
Ред 112:
==Потенциални грешки при използването на конструктори и деструктори==
Често приложение на конструкторите и деструкторите е да се използват за съответно динамично заделяне и освобождаване на памет. Трябва да се внимава, тъй като може да се получат случаи, в които всеки обект от един клас да се опита да освободи едно и също пространство в паметта и респективно после да я освободи. Друг пример е при връщането на обект като резултат от функция - Създава се създава едно междинно копие на връщания обект, което не изпълнява конструктора на класа си, защото той вече е изпълнен за обекта, който се копира - т.е. копието е от настоящия момент. След връщането на този обект обаче ще се задейства деструктора не само на самия обект, който се връща, но и на междинния. Тогава двата обекта ще се опитат да освободят една и съща заделена памет.
 
== Inline декларации ==
Почти винаги конструкторите и деструкторите са малки на размер и почти винаги се дефинират inline. (Това е декларация, при която инструкциите на функцията директно се заместват на всяко място, на което се използва, наподобявайки [[предпроцесорна директива]]). Когато вместо прототип директно конструктора/десктруктора се дефинира компилаторът (ако изобщо поддържа inline) предполага, че това е inline декларация.
Например първия пример е по-удачно да се напише така (резултата почти не се различава като обем на програмата или бързодействие, но самото писане и четене на кода е по-лесно):
<source lang="cpp">
#include <iostream>
using namespace std;
class x {
int id;
public:
x() { id = 1; } //inline декларация на конструктора
void hey();
} y;
 
void x::hey()
{
cout << "This is object " << id << " speaking!" << endl;
}
 
int main()
{
y.hey();
}
</source>