180 likes | 387 Views
Обект предаван като параметър на функция и обект връщан като резултат от функция. Обект предаван като параметър на функция Начини за предаване на обект като параметър на функция Предаване по стойност Предаване по стойност – имитиране предаване по адрес ( чрез указател )
E N D
Обект предаван като параметър на функция и обект връщан като резултат от функция • Обект предаван като параметър на функция • Начини за предаване на обект като параметър на функция • Предаване по стойност • Предаване по стойност – имитиране предаване по адрес (чрезуказател) • Предаване по адрес (чрез псевдоним)
Обект предаван като параметър на функция и обект връщан като резултат от функция • Обект предаван като параметър на функция • Предаване по стойност • Стойностите на фактическите параметри (обекти) се копират в стек. Копието след това се разрушава. Промени на формалните параметри не оказват влияние върху фактическите параметри.
Обект предаван като параметър на функция • Предаване по стойност #include <iostream.h> 1/2 class point { int x,y; public: point(int abs=0,int ord=0) //конструктор inline { x=abs; y=ord; } char *coincide(point);//параметър->обект, предаван по стойност void out(); }; char *point::coincide(point p) //дефиниция на функцията { if(p.x==x&&p.y==y) { p.x+=1; return “съвпадат”; } else return “не съвпадат”; }
Обект предаван като параметър на функция • Предаване по стойност void point::out() 2/2 { cout<<“x=“<<x<<“\n”; cout<<“y=“<<y<<endl; } void main() { point a,b(1),c(1,0); cout<<”a и b:”<<a.coincide(b)<<”\n”; cout<<”b и c:”<<b.coincide(c)<<”\n”; c.out(); } a и b: не съвпадат b и c:съвпадат x=1 y=0 Фактическият параметър cне се променя
Обект предаван като параметър на функция • Предаване по стойност – имитиране предаване по адрес (чрез указател) • Копира се не целият обект, а само адреса. Промени на формалните параметри предизвикват промени на фактическите параметри. . . . class point { …… char *coincide(point *); //параметър->указател, }; //предаван по стойност char *point::coincide(point *p) { if( p->x==x&&p->y==y ) { p->x+=1; return “съвпадат”; } else return “не съвпадат”; }
Обект предаван като параметър на функция • Предаване по стойност – имитиране предаване по адрес (чрез указател) void main() { point a,b(1),c(1,0); cout<<”a и b:”<<a.coincide(&b)<<”\n”; cout<<”b и c:”<<b.coincide(&c)<<”\n”; c.out(); } a и b: не съвпадат b и c:съвпадат x=2 y=0 Фактическият параметър cсе променя
Обект предаван като параметър на функция • Предаване по адрес (чрез псевдоним) • Адресите на фактическите параметри се съхраняват впаметта на съответните формални параметри. • При предаване по адрес не се правят копия, които даподлежат на разрушаване. • Промени на формалните параметри предизвикват промени на фактическите параметри.
Псевдоними • Псевдонимът е алтернативно име на обект. • Дефиницията на променлива от тип псевдоним задължително е с инициализация – дефинирана променлива от същия тип като на базовия тип на типа псевдоним. • След това не е възможно променливата-псевдоним да стане псевдоним на нова променлива. . . . int a = 5; int &syn = a; // syn е псевдоним на a int b = 10; int& syn = b; // error, повторна дефиниция . . .
Псевдоними Общ вид на дефиниране тип&име_на псевдоним = име_на променлива; Пример 1 int ii = 0; int& rr = ii; rr++; // rr++; не променя адреса на rr, а стойността на ii // rr++ е еквивалентен на ii++ int* pp = &rr; // Адресът на rrе адреса на ii
Псевдоними Пример 2 . . . int a = 5; int &syn = a; cout << syn << " " << a << '\n'; int b = 10; syn = b; cout << b << " " << a << “ “ << syn << '\n'; . . . Еквивалентно е на a=b; 5 5 10 10 10
Псевдоними Пример 3 int a=6; //а и ра са две различни имена на един и същи обект int &pa=a; //псевдонимът ра е друго име на а float b=6.6; //b и pb са два обекта от различен тип int&pb=b; //стойността на b се преобразува към типа на pb • Промяната на а води до промяна на ра и обратно. • Променливите b и pb са от различен тип и промяната на pb не се отразява върху b и обратно.
Обект предаван като параметър на функция • Предаване по адрес (чрез псевдоним) . . . class point { …… char *coincide(point &); //параметър->псевдоним, }; //предаване по адрес char *point::coincide(point &p) { if(p.x==x&&p.y==y) { p.x+=1; return “съвпадат” } else return “не съвпадат”’ } void main() { point a,b(1),c(1,0); cout<<”a и b:”<<a.coincide(b)<<”\n”; cout<<”b и c:”<<b.coincide(c)<<”\n”; c.out(); } a и b: не съвпадат b и c:съвпадат x=2 y=0 Фактическият параметър cсе променя
Обект предаван като параметър на функция • Предаване по адрес (чрез псевдоним) • Псевдонимкато параметър на функция се използва запредаване на модифицируеми параметри. • Ако обектът (псевдоним) не трябва да бъде променян отфункцията се използва константен псевдоним (служебната думаconst). char *coincide(const point &p); //функцията не може да променя р Константен псевдоним
Обект връщан като резултат от функция • Ако се връща обект, то във викащата функция се прави копие, което след това се разрушава. • Ако се връща псевдонимне се прави копие. • Такава функция може да се използва като лява страна на оператор за присвояване. class point { …… pointsymetric(); //резултат обект, връщан по стойност point &symetric1(); //резултат псевдоним, връщан по адрес }; point point::symetric() { point res; res.x=-x; res.y=-y; return res; } point &point::symetric1() { x=-x; y=-y; return *this; }
Обект връщан като резултат от функция Пример за сравнение на предаването на обект по адрес (чрез псевдоним)и връщане на резултат обект (чрез псевдоним) с предаване на обект по стойност и връщане на резултат обект по стойност include <iostream.h> 1/2 class point() { int x,y; public: point(int i=3, int j=4) { x=i; y=j; cout<<”конструктор\n”; } ~point() { cout<<”деструктор\n”; } char *coincide(point &p) char *coincide(point p) { if(p.x==x&&p.y==y) { if(p.x==x&&p.y==y) return “съвпадат”; return “съвпадат”; else return “не съвпадат”; else return “не съвпадат”; }}
Обект връщан като резултат от функция Примерза сравнение на предаването на обект по адрес (чрез псевдоним)и връщане на резултат обект (чрез псевдоним) с предаване на обект по стойност и връщане на резултат обект по стойност point & symetric() point symetric() 2/2 { x=-x; y=-y; { point t; return *this; t.x=-x;t.y=-y; } return t; } void out() { cout<<x<<” “<<y<<”\n”; } }; void main() { point a,b(6),c(6,4); cout<<a.out()<<”и “<<b.out()<<a.coincide(b)<<”\n|; cout<<”симетричната на “<<c.out(); cout<<” е “<<(c.symetric()).out()<<”\n; }
Обект връщан като резултат от функция Резултати от изпълнение при предаването на обект по адрес (чрез псевдоним)и връщане на резултат обект (чрез псевдоним) конструктор конструктор конструктор 3 4 и 6 4 не съвпадат симетричната на 6 4 е –6 –4 деструктор деструктор деструктор
Обект връщан като резултат от функция Резултати от изпълнение при предаването на обект по стойност и връщане на резултат обект постойност конструктор конструктор конструктор деструктор//от копието на р 3 4 и 6 4 не съвпадат конструктор//от временен обект t деструктор//в symetric симетричната на 6 4 е –6 –4 деструктор//за резултата от symetric деструктор деструктор деструктор