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

Изтрито е съдържание Добавено е съдържание
Mishobg12 (беседа | приноси)
Редакция без резюме
правопис, препратки
Ред 1:
В [[Обектно-ориентирано програмиране|обектно-ориентираното програмиране]] '''конструкторът''' е блок от инструкции, който се изпълнява за [[инициализация]] на един [[обект]] при неговото създаване. Практически конструкторът може да извършва всякакъв вид действия, но ако не друго, то е поне признак за много лош стил на програмиране да се изполва за действия, които не засягат пряко създавания обект, тъй като това може да доведе до неочаквани грешки, особено в големи програми. В [[език за програмиране|езика за програмиране]] [[C++]] конструкторът се представя като [[Функция на C++|член-функция]] на един обект, носеща същото име като него.
Тя и [[Конструктор (програмиране)#.D0.94.D0.B5.D1.81.D1.82.D1.80.D1.83.D0.BA.D1.82.D0.BE.D1.80|деструктор]]а)деструкторът са единственияединствените типтипове дефиниции на функции, за които не се дефинира тип на връщания резултат. В тази статия примерите са дадени на този език.
 
== Елементарна дефиниция на обект с конструктор ==
<source lang="cpp">
#include <iostream>
Line 32 ⟶ 34:
 
</code>
При инициализацията на обект <code>y</code> на <code>id</code> се задава стойност <code>1</code>. При извикването на функцията <code>y.hey()</code> на екрана се изписва съдържанието на id оградено от низовете "This is object " и " speaking!".
 
При инициализацията на обект <code>y</code> на <code>id</code> се задава стойност <code>1</code>. При извикването на функцията <code>y.hey()</code> на екрана се изписва съдържанието на <code>id</code> оградено от низовете[[низ]]овете <code>"This is object "</code> и <code>" speaking!"</code>.
==Конструктори с аргументи==
 
== Конструктори с аргументи ==
Функцията-конструктор може да приеме аргументи, като така всеки обект може да бъде инициализиран с индивидуални стойности:
 
<source lang="cpp">
#include <iostream>
Line 69 ⟶ 73:
 
</code>
 
Тази програма съдържа два обекта от клас <code>x</code> - <code>y</code> и <code>z</code>. КонструктурътКонструкторът приема стойност 1 при първия, и стойност 2 при втория, което записва в променливата <code>id</code> на <code>y</code> стойност 1, а в променливата <code>id</code> на <code>z</code> - 2.
 
== Деструктор ==
Деструкторът на практика е точно обратното на конструктора. Това е блок от конструкции, който се изпълнява при унищожаването на един обект (това най-често се случва, когато един обект напусне областта си на видимост - например ако е локален за някоя функция, той ще напусне областта си на видимост, когато тя приключи своето изпълнение).
 
В [[C++]] той се дефинира по същиятсъщия начин като конструктора, но бива предхождан от оператора за инвертиране - <code>~</code>.
 
<source lang="cpp">
#include <iostream>
Line 109 ⟶ 116:
</code>
 
== Потенциални грешки при използването на конструктори и деструктори ==
 
Често приложение на конструкторите и деструкторите е да се използват за съответно [[динамично заделяне на памет|динамично заделяне и освобождаване на памет]]. Трябва да се внимава, тъй като може да се получат случаи, в които всеки обект от един клас да се опита да освободи едно и също пространство в [[компютърна памет|паметта]] и респективно после да я освободи. Друг пример е при връщането на обект като резултат от функция: - Създавасъздава се създава едно междинно копие на връщания обект, което не изпълнява конструктора на класа си, защото той вече е изпълнен за обекта, който се копира - т.е. копието е от настоящия момент. След връщането на този обект обаче ще се задейства деструкторадеструкторът не само на самия обект, който се връща, но и на междинния. Тогава двата обекта ще се опитат да освободят една и съща заделена памет.
==Потенциални грешки при използването на конструктори и деструктори==
Често приложение на конструкторите и деструкторите е да се използват за съответно динамично заделяне и освобождаване на памет. Трябва да се внимава, тъй като може да се получат случаи, в които всеки обект от един клас да се опита да освободи едно и също пространство в паметта и респективно после да я освободи. Друг пример е при връщането на обект като резултат от функция - Създава се създава едно междинно копие на връщания обект, което не изпълнява конструктора на класа си, защото той вече е изпълнен за обекта, който се копира - т.е. копието е от настоящия момент. След връщането на този обект обаче ще се задейства деструктора не само на самия обект, който се връща, но и на междинния. Тогава двата обекта ще се опитат да освободят една и съща заделена памет.
 
== Inline декларации ==
Почти винаги конструкторите и деструкторите са малки на размер и почти винаги се дефинират inline. (Това е декларация, при която инструкциите на функцията директно се заместват на всяко място, на което се използва, наподобявайки [[предпроцесорна директива]]). Когато вместо прототип директно конструктора/деструктора се дефинира конструкторът/деструкторът, компилаторът (ако изобщо поддържа inline) предполага, че това е inline декларация.
 
Например първияпървият пример е по-удачно да се напише така (резултатарезултатът почти не се различава като обем на програмата или бързодействие, но самото писане и четене на кода е по-лесно):
 
<source lang="cpp">
#include <iostream>
Line 139 ⟶ 148:
== Синтаксис в други езици за програмиране ==
=== PHP ===
Във версиите по-стари от [[PHP]] 5 името на конструктора съвпада с името на класа както в [[C++]]. От версия 5 се използва името <code>__constructor</code>.
 
<source lang="php">
class Person