1 / 18

Обект предаван като параметър на функция и обект връщан като резултат от функция

Обект предаван като параметър на функция и обект връщан като резултат от функция. Обект предаван като параметър на функция Начини за предаване на обект като параметър на функция Предаване по стойност Предаване по стойност – имитиране предаване по адрес ( чрез указател )

dacian
Download Presentation

Обект предаван като параметър на функция и обект връщан като резултат от функция

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Обект предаван като параметър на функция и обект връщан като резултат от функция • Обект предаван като параметър на функция • Начини за предаване на обект като параметър на функция • Предаване по стойност • Предаване по стойност – имитиране предаване по адрес (чрезуказател) • Предаване по адрес (чрез псевдоним)

  2. Обект предаван като параметър на функция и обект връщан като резултат от функция • Обект предаван като параметър на функция • Предаване по стойност • Стойностите на фактическите параметри (обекти) се копират в стек. Копието след това се разрушава. Промени на формалните параметри не оказват влияние върху фактическите параметри.

  3. Обект предаван като параметър на функция • Предаване по стойност #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 “не съвпадат”; }

  4. Обект предаван като параметър на функция • Предаване по стойност 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не се променя

  5. Обект предаван като параметър на функция • Предаване по стойност – имитиране предаване по адрес (чрез указател) • Копира се не целият обект, а само адреса. Промени на формалните параметри предизвикват промени на фактическите параметри. . . . class point { …… char *coincide(point *); //параметър->указател, }; //предаван по стойност char *point::coincide(point *p) { if( p->x==x&&p->y==y ) { p->x+=1; return “съвпадат”; } else return “не съвпадат”; }

  6. Обект предаван като параметър на функция • Предаване по стойност – имитиране предаване по адрес (чрез указател) 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се променя

  7. Обект предаван като параметър на функция • Предаване по адрес (чрез псевдоним) • Адресите на фактическите параметри се съхраняват впаметта на съответните формални параметри. • При предаване по адрес не се правят копия, които даподлежат на разрушаване. • Промени на формалните параметри предизвикват промени на фактическите параметри.

  8. Псевдоними • Псевдонимът е алтернативно име на обект. • Дефиницията на променлива от тип псевдоним задължително е с инициализация – дефинирана променлива от същия тип като на базовия тип на типа псевдоним. • След това не е възможно променливата-псевдоним да стане псевдоним на нова променлива. . . . int a = 5; int &syn = a; // syn е псевдоним на a int b = 10; int& syn = b; // error, повторна дефиниция . . .

  9. Псевдоними Общ вид на дефиниране тип&име_на псевдоним = име_на променлива; Пример 1 int ii = 0; int& rr = ii; rr++; // rr++; не променя адреса на rr, а стойността на ii // rr++ е еквивалентен на ii++ int* pp = &rr; // Адресът на rrе адреса на ii

  10. Псевдоними Пример 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

  11. Псевдоними Пример 3 int a=6; //а и ра са две различни имена на един и същи обект int &pa=a; //псевдонимът ра е друго име на а float b=6.6; //b и pb са два обекта от различен тип int&pb=b; //стойността на b се преобразува към типа на pb • Промяната на а води до промяна на ра и обратно. • Променливите b и pb са от различен тип и промяната на pb не се отразява върху b и обратно.

  12. Обект предаван като параметър на функция • Предаване по адрес (чрез псевдоним) . . . 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се променя

  13. Обект предаван като параметър на функция • Предаване по адрес (чрез псевдоним) • Псевдонимкато параметър на функция се използва запредаване на модифицируеми параметри. • Ако обектът (псевдоним) не трябва да бъде променян отфункцията се използва константен псевдоним (служебната думаconst). char *coincide(const point &p); //функцията не може да променя р Константен псевдоним

  14. Обект връщан като резултат от функция • Ако се връща обект, то във викащата функция се прави копие, което след това се разрушава. • Ако се връща псевдонимне се прави копие. • Такава функция може да се използва като лява страна на оператор за присвояване. 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; }

  15. Обект връщан като резултат от функция Пример за сравнение на предаването на обект по адрес (чрез псевдоним)и връщане на резултат обект (чрез псевдоним) с предаване на обект по стойност и връщане на резултат обект по стойност 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 “не съвпадат”; }}

  16. Обект връщан като резултат от функция Примерза сравнение на предаването на обект по адрес (чрез псевдоним)и връщане на резултат обект (чрез псевдоним) с предаване на обект по стойност и връщане на резултат обект по стойност 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; }

  17. Обект връщан като резултат от функция Резултати от изпълнение при предаването на обект по адрес (чрез псевдоним)и връщане на резултат обект (чрез псевдоним) конструктор конструктор конструктор 3 4 и 6 4 не съвпадат симетричната на 6 4 е –6 –4 деструктор деструктор деструктор

  18. Обект връщан като резултат от функция Резултати от изпълнение при предаването на обект по стойност и връщане на резултат обект постойност конструктор конструктор конструктор деструктор//от копието на р 3 4 и 6 4 не съвпадат конструктор//от временен обект t деструктор//в symetric симетричната на 6 4 е –6 –4 деструктор//за резултата от symetric деструктор деструктор деструктор

More Related