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

от Уикипедия, свободната енциклопедия
Изтрито е съдържание Добавено е съдържание
Mishobg12 (беседа | приноси)
м премести „Конструктор“ като „Конструктор (програмиране)“: Например би могло да има статии за детската играчка конструктор или длъ
Mishobg12 (беседа | приноси)
Редакция без резюме
Ред 134: Ред 134:
{
{
y.hey();
y.hey();
}
</source>

== Синтаксис в други езици за програмиране ==
=== PHP ===
Във версиите по-стари от PHP 5 името на конструктора съвпада с името на класа както в [[C++]]. От версия 5 се използва името <code>__constructor</code>.
<source lang="php">
class Person
{
private $name;
function __construct($name)
{
$this->name = $name;
}
function getName()
{
return $this->name;
}
}
}
</source>
</source>

Версия от 18:53, 12 април 2009

В обектно-ориентираното програмиране конструкторът е блок от инструкции, който се изпълнява за инициализация на един обект при неговото създаване. Практически конструкторът може да извършва всякакъв вид действия, но ако не друго, то е поне признак за много лош стил на програмиране да се изполва за действия, които не засягат пряко създавания обект, тъй като това може да доведе до неочаквани грешки, особено в големи програми. В езика за програмиране 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;
   }
}