Trecerea la obiecte de funcții, de programare în C și c
Obiectele pot fi transferate să funcționeze în același mod ca și orice alt tip de variabile. Obiectele au trecut la funcțiile folosind valoarea standard a mecanismului de transmisie. Acest lucru înseamnă că, creează o copie a obiectului, care a trecut la funcția. Cu toate acestea, faptul că o copie înseamnă, în esență, care creează un obiect diferit. Ca urmare, se pune întrebarea dacă funcția constructor al obiectului este executat la crearea unei copii, iar în cazul în care funcția este executată, destructorul atunci când copia este distrusă. Răspunsul la aceste două întrebări pot fi foarte surprinzător. În primul rând, ia în considerare un exemplu:
#include
clasa_mea clasa int i;
publice:
myclass (int n);
myclass ();
void set_i (int n)
get_i int ()
>;
myclass :: myclass (int n)
i = n;
cout <<"Constructing " <>
Clasa_Mea ::
myclass ()
cout <<"Destroying " <>
void f (ob myclass);
int main ()
myclass (1);
f (o);
cout <<"This is i in main: ";
cout <<о.get_i() <<"\n";
return 0;
>
void f (ob myclass)
ob.set_i (2);
cout <<"This is local i: " <
>
Acest program afișează următorul text:
1 Constructing
Aceasta este i locală: 2
distrugând 2
Acest lucru este în principal i: 1
distrugând 1
Rețineți că două apeluri au avut loc destructor, în timp ce valsya de designer-vyzy doar o singură dată. Textul Derivat ilustrează faptul că funcția de constructor nu este apelat atunci când copia obiectului (în programul principal ()) este transmis la variabila ob (in interiorul f () funcția). Motivul pentru care constructorul nu este apelat atunci când o copie a obiectului poate fi ușor de înțeles. Atunci când un obiect este trecut la funcția, aveți nevoie de starea curentă a obiectului. În cazul în care atunci când se creează un constructor de copiere este numit, ar fi efectuat inițializarea obiectului, co-Thoraya ar schimba starea. Prin urmare, proiectantul nu poate fi invocat atunci când crearea unui obiect de co-ISD pentru a trece la funcția.
Deși funcția de constructor nu este numit atunci când un obiect este trecut la o funcție, trebuie să vyzy TVA destructor atunci când distruge copii. (O copie a obiectului este distrus, precum și orice variabilă locală, după încheierea funcției.) Trebuie amintit că copia obiectului sous-există atâta timp cât funcția este executată. Aceasta înseamnă că o copie poate efectua radio operator de căi, ceea ce va necesita apelarea destructor pentru a distruge această copie. De exemplu, o copie poate rezerva de memorie, care trebuie să fie eliberat la distrugerea acestuia. Din acest motiv, distrugerea de copii trebuie să apelați destructor.
Pe scurt. Când creați o copie a obiectului să-l transmită funcția de constructor obiect nu este numit. Cu toate acestea, atunci când o copie a obiectului in interiorul functiei este distrus, destructor este numit.
În mod implicit, atunci când creați o copie a obiectului pe care îl copie bitwise apare. Aceasta înseamnă că un nou obiect este o copie exactă a originalului. Faptul că face o copie exactă, poate, în unele cazuri, să fie o sursă de îngrijorare. În timp ce utilizați mecanismul normal al valorii transferului, care, în teorie, protejează și izoleaza numit acest argument, este posibilitatea de efecte secundare, ca urmare a Coto ryh obiect folosit ca argument poate fi deteriorat pentru a trece un obiect în funcție. De exemplu, în cazul în care un obiect folosit ca argument, alocă memorie și eliberează memoria când sa distrus-SRI, apoi copia sa locală în interiorul funcției va elibera aceeași memorie atunci când este solicitat de struktora. Ca urmare, obiectul original este deteriorat și, în esență, inutil. Este posibil pentru a preveni apariția unor astfel de probleme cu ajutorul operatorului pentru propria lor clasă prin crearea unui constructor de tip spe cial numit constructorul copy.