Конструктор (обектно ориентирано програмиране): Разлика между версии
Ted Masters (беседа | приноси) Грешки в статичния код: Грешно вложени тагове; форматиране: 5x тире, 3x нов ред, 14 интервала (ползвайки Advisor) |
м Bot: Replace deprecated <source> tag and "enclose" parameter |
||
Ред 5: | Ред 5: | ||
== Елементарна дефиниция на обект с конструктор == |
== Елементарна дефиниция на обект с конструктор == |
||
< |
<syntaxhighlight lang="cpp"> |
||
#include <iostream> |
#include <iostream> |
||
using namespace std; |
using namespace std; |
||
Ред 29: | Ред 29: | ||
y.hey(); |
y.hey(); |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
Това ще изпише: |
Това ще изпише: |
||
Ред 40: | Ред 40: | ||
Функцията-конструктор може да приеме аргументи, като така всеки обект може да бъде инициализиран с индивидуални стойности: |
Функцията-конструктор може да приеме аргументи, като така всеки обект може да бъде инициализиран с индивидуални стойности: |
||
< |
<syntaxhighlight lang="cpp"> |
||
#include <iostream> |
#include <iostream> |
||
using namespace std; |
using namespace std; |
||
Ред 65: | Ред 65: | ||
z.hey(); |
z.hey(); |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
Това ще изпише: |
Това ще изпише: |
||
Ред 79: | Ред 79: | ||
В [[C++]] той се дефинира по същия начин като конструктора, но бива предхождан от оператора за инвертиране – <code>~</code>. |
В [[C++]] той се дефинира по същия начин като конструктора, но бива предхождан от оператора за инвертиране – <code>~</code>. |
||
< |
<syntaxhighlight lang="cpp"> |
||
#include <iostream> |
#include <iostream> |
||
using namespace std; |
using namespace std; |
||
Ред 103: | Ред 103: | ||
cout << "This is the main() function speaking!" << endl; |
cout << "This is the main() function speaking!" << endl; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
Това изписва: |
Това изписва: |
||
Ред 120: | Ред 120: | ||
Например първият пример е по-удачно да се напише така (резултатът почти не се различава като обем на програмата или бързодействие, но самото писане и четене на кода е по-лесно): |
Например първият пример е по-удачно да се напише така (резултатът почти не се различава като обем на програмата или бързодействие, но самото писане и четене на кода е по-лесно): |
||
< |
<syntaxhighlight lang="cpp"> |
||
#include <iostream> |
#include <iostream> |
||
using namespace std; |
using namespace std; |
||
Ред 139: | Ред 139: | ||
y.hey(); |
y.hey(); |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
== Синтаксис в други езици за програмиране == |
== Синтаксис в други езици за програмиране == |
||
Ред 145: | Ред 145: | ||
Във версиите по-стари от [[PHP]] 5 името на конструктора съвпада с името на класа както в [[C++]]. От версия 5 се използва името <code>__constructor</code>. |
Във версиите по-стари от [[PHP]] 5 името на конструктора съвпада с името на класа както в [[C++]]. От версия 5 се използва името <code>__constructor</code>. |
||
< |
<syntaxhighlight lang="php"> |
||
class Person |
class Person |
||
{ |
{ |
||
Ред 160: | Ред 160: | ||
} |
} |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
[[Категория:Обектно-ориентирано програмиране]] |
[[Категория:Обектно-ориентирано програмиране]] |
Версия от 21:09, 17 април 2020
За информацията в тази статия или раздел не са посочени източници. Въпросната информация може да е непълна, неточна или изцяло невярна. Имайте предвид, че това може да стане причина за изтриването на цялата статия или раздел. |
В обектно-ориентираното програмиране конструкторът е блок от инструкции, който се изпълнява за инициализация на един обект при неговото създаване. Практически конструкторът може да извършва всякакъв вид действия, но ако не друго, то е поне признак за много лош стил на програмиране да се изполва за действия, които не засягат пряко създавания обект, тъй като това може да доведе до неочаквани грешки, особено в големи програми. В езика за програмиране C++ конструкторът се представя като член-функция на един обект, носеща същото име като него.
Тя и деструкторът са единствените типове дефиниции на функции, за които не се дефинира тип на връщания резултат. В тази статия примерите са дадени на този език.
Елементарна дефиниция на обект с конструктор
#include <iostream>
using namespace std;
class x {
int id;
public:
x(); //Прототип на конструктора
void hey();
} y;
x::x() //Дефиниция на конструктора
{
id = 1;
}
void x::hey()
{
cout << "This is object " << id << " speaking!" << endl;
}
int main()
{
y.hey();
}
Това ще изпише:
This is object 1 speaking!
При инициализацията на обект y
на id
се задава стойност 1
. При извикването на функцията y.hey()
на екрана се изписва съдържанието на id
оградено от низовете "This is object "
и " speaking!"
.
Конструктори с аргументи
Функцията-конструктор може да приеме аргументи, като така всеки обект може да бъде инициализиран с индивидуални стойности:
#include <iostream>
using namespace std;
class x {
int id;
public:
x(int ident);
void hey();
} y(1), z(2);
x::x(int ident)
{
id = ident;
}
void x::hey()
{
cout << "This is object " << id << " speaking!" << endl;
}
int main()
{
y.hey();
z.hey();
}
Това ще изпише:
This is object 1 speaking!
This is object 2 speaking!
Тази програма съдържа два обекта от клас x
– y
и z
. Конструкторът приема стойност 1 при първия, и стойност 2 при втория, което записва в променливата id
на y
стойност 1, а в променливата id
на z
– 2.
Деструктор
Деструкторът на практика е точно обратното на конструктора. Това е блок от конструкции, който се изпълнява при унищожаването на един обект (това най-често се случва, когато един обект напусне областта си на видимост – например ако е локален за някоя функция, той ще напусне областта си на видимост, когато тя приключи своето изпълнение).
В C++ той се дефинира по същия начин като конструктора, но бива предхождан от оператора за инвертиране – ~
.
#include <iostream>
using namespace std;
class x {
int id;
public:
x();
~x(); //Прототип на деструктора
} y;
x::x()
{
cout << "Constructing y." << endl;
}
x::~x()
{
cout << "Destructing y." << endl;
}
int main()
{
cout << "This is the main() function speaking!" << endl;
}
Това изписва:
Constructing y.
This is the main() function speaking!
Destructing y.
Потенциални грешки при използването на конструктори и деструктори
Често приложение на конструкторите и деструкторите е да се използват за съответно динамично заделяне и освобождаване на памет. Трябва да се внимава, тъй като може да се получат случаи, в които всеки обект от един клас да се опита да освободи едно и също пространство в паметта и респективно после да я освободи. Друг пример е при връщането на обект като резултат от функция: създава се едно междинно копие на връщания обект, което не изпълнява конструктора на класа си, защото той вече е изпълнен за обекта, който се копира – т.е. копието е от настоящия момент. След връщането на този обект обаче ще се задейства деструкторът не само на самия обект, който се връща, но и на междинния. Тогава двата обекта ще се опитат да освободят една и съща заделена памет.
Inline-декларации
Почти винаги конструкторите и деструкторите са малки на размер и почти винаги се дефинират inline. (Това е декларация, при която инструкциите на функцията директно се заместват на всяко място, на което се използва, наподобявайки предпроцесорна директива). Когато вместо прототип директно се дефинира конструкторът/деструкторът, компилаторът (ако изобщо поддържа inline) предполага, че това е inline декларация.
Например първият пример е по-удачно да се напише така (резултатът почти не се различава като обем на програмата или бързодействие, но самото писане и четене на кода е по-лесно):
#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();
}
Синтаксис в други езици за програмиране
PHP
Във версиите по-стари от PHP 5 името на конструктора съвпада с името на класа както в C++. От версия 5 се използва името __constructor
.
class Person
{
private $name;
function __construct($name)
{
$this->name = $name;
}
function getName()
{
return $this->name;
}
}