Минавайки обекти до функции, програмиране в С и С

Предметите могат да се прехвърлят за да функционира по същия начин, както всеки друг вид променливи. Обекти предадени на функции с помощта на стандартната стойност на механизма за пренос. Това означава, че създава копие на обекта, който предава на функцията. Въпреки това, фактът, че копие означава по същество, което създава различен предмет. В резултат на това възниква въпросът дали функцията конструктор на обекта се изпълнява при създаването на копие, а ако функцията се изпълнява, деструктор, когато копието е унищожен. Отговорът на тези два въпроса може да бъде много изненадващо. Първо, помислете за един пример:

#include
класа MyClass Int I;
публичния:
MyClass (междинно съединение п);

MyClass ();
невалидни set_i (междинно съединение п)
Int get_i ()
>;
MyClass :: MyClass (инт н)
I = N;
Cout <<"Constructing " <>
MyClass ::

MyClass ()
Cout <<"Destroying " <>
невалидни е (MyClass об);
INT главната ()
MyClass от (1);
е (о);
Cout <<"This is i in main: ";
Cout <<о.get_i() <<"\n";
връщане 0;
>
невалидни е (MyClass об)
ob.set_i (2);
Cout <<"This is local i: " < Cout <<" \n";
>

Тази програма показва следния текст:

Изграждане 1
Това е местен и: 2
Унищожаването 2
Това е и в главната: 1
Унищожаването 1

Имайте предвид, че две обаждания са имали деструктор място, а дизайнер-vyzy valsya само веднъж. Извлечен текст показва, че функцията конструктор не се нарича, когато копието на обекта (в основната програма ()) се предава на променливата на об (функция вътре е ()). Причината, поради която строителя не се нарича, когато копие на обекта може лесно да бъде разбран. Когато даден обект се предава на функцията, трябва текущото състояние на обекта. Ако при създаването на конструктор копие се нарича, тя щеше да извърши инициализацията на обектите, съвместно Thoraya ще променя състоянието си. Ето защо, дизайнерът не може да се ползва при създаването на обект за съвместно ПЧИ да премине към функцията.

Въпреки че функцията конструктор не се нарича, когато един обект се предава на функция, трябва да vyzy ДДС деструктор, когато унищожаването екземпляра. (А копие на обекта е унищожена, както и всяка локална променлива, след края на функцията.) Трябва да се има предвид, че копието на обекта су съществува толкова дълго, колкото на функцията се изпълнява. Това означава, че копие може да изпълнява оператор радиостанции, което ще изисква обажда деструктор да унищожи това копие. Например, един екземпляр може да резервира памет, която трябва да бъде освободен при разрушаването му. Поради тази причина, унищожаването на екземпляри трябва да се обадите деструктор.

В обобщение. Когато създавате копие на обекта, за да го предава на функцията на строителя на обекта не се нарича. Въпреки това, когато копие на обекта в самата функция е унищожена, деструкторът се вика.

По подразбиране, когато създавате копие на обекта го побитовото копие се появява. Това означава, че един нов обект е точно копие на оригинала. Фактът, че прави точно копие, в някои случаи може да бъде източник на безпокойство. При използване на нормален механизъм на стойността на прехвърлянето, което на теория, предпазва и изолира наречен аргумент, е възможността за странични ефекти, в резултат на Кото ryh обект използва като аргумент може да се повреди да премине обект на функцията. Например, ако даден обект, използван като аргумент, разпределя памет и освобождава паметта, когато му погубено-SRI, а след това му локално копие в самата функция ще освободи една и съща памет, когато бъде призован де struktora. В резултат на това на оригиналния обект е повреден и същество е безполезно. Възможно е да се предотврати появата на такива проблеми, с помощта на оператора за собствената си класа, чрез създаване на спе-циален тип конструктор нарича конструктор за копиране.