Приятелски функции

by Svetlana Georgieva

This free e-book was created with
Ourboox.com

Create your own amazing e-book!
It's simple and free.

Start now

Приятелски функции

  • Joined Mar 2020
  • Published Books 30

Функции, които имат достъп до всички компоненти на класа така, както и член-функциите на класа.

 

Декларацията на приятелската функция може да се намира както в частта public, така и в частта private и се характеризира с ключовата дума friend, която се поставя в началото на декларацията.

 

Приятелските функции не са член-функции и не получават по неявен начин параметъра this. Това изисква подаването на обект по явен начин като параметър на функцията.

 

Общ вид на извикване на приятелска функция:

име_на_функция(списък фактически параметри);

2

1. Независима функция  – приятелска за класа

Приятелската функция има един или повече параметри от тип клас или връщан резултат от тип клас.

Параметрите на приятелската функция могат да се предават по адрес или постойност.

Общ вид:

class A

   { //член-данни

      friend void fun(A,A&);  //декларация на приятелска функция

                              //в частта private

      public:

        //декларации на член-функции на класа А

   };

//дефиниции на член-функции на класа А

void fun(A a, A& b)           //дефиниция на приятелска функция

   {…………..}

3

Пример

#include <iostream.h>

class point

   { int x,y;                

     public:

     point(int a=0,int b=0)

       { x=a; y=b; }

     //деклариране на независима приятелска функция    

     friend int coincide(point,point);               

    };

int coincide(point p,point q) //обекти и q – предавани по стойност

   { if(p.x==q.x && p.y==q.y) return 1;

     else return 0;

   }

void main()

   { point a(1,0),b(1),c;

     if(coincide(a,b)) cout<< “точките съвпадатn”;

     else cout<<”точките са различниn”;

     if(coincide(a,c)) cout<< “точките съвпадатn”;

         else cout<<”точките са различниn”;

     }

Резултати от изпълнение

точките съвпадат

точките са различни

4

2. Независима функция  – приятелска за два или повече класа

Функцията трябва да се декларира във всеки от класовете като приятелска.

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

Декларацията на първия от класовете (който се компилира най-напред) трябва да се предхожда от заглавните редове на декларациите на другите класове.

Общ вид:

class B;                            //заглавен ред на клас В

class А

    { //член-данни на класа А

      public:

      //декларации на член-функции на клас А

      friend void fun(A,A&,B,B&);   //декларация на приятелска

                                    //за А и В функция

    };

//дефиниции на член-функции на клас А

class B

    { //член-данни на класа B

      public:

      //декларации на член-функции на клас B

      friend void fun(A,A&,B,B&);   //декларация на приятелска

                                    //за А и В функция

    };

//дефиниции на член-функции на клас B

void fun(A a,A &b,B c,B &d)         //дефиниция на приятелска

   { ………………………………}                  //функция

5

Пример

#include <iostream.h>

#include <math.h>

class circle;

class tri

   { int a,b,c;

     public:

     tri(int x=0,int y=0,int z=0)

        { a=x;b=y;c=z; }

     ~tri() { cout<<”деструктор trin”; }

     friend float lice(tri &,circle &);   //декларация на приятелска

   };                                     //за tri и circle функция

class circle

   { int r;

     public:

     circle(int x=0)

        { r=x; }

     ~circle() { cout<<”деструктор circlen”; }

     friend float lice(tri &,circle &);   //декларация на приятелска

   };                                     //за tri и circle функция

float lice(tri &t,circle &c)              //дефиниция на приятелска

   { float p=(t.a+t.b+t.c)/2;             //за tri и circle функция

     float s;

     s=sqrt(p*(p-t.a)*(p-t.b)*(p-t.c));

     s+=3.14*pow(c.r,2);

     return s;

    }

void main()

   { tri x(4,4,8);

     circle y(5);

     cout<<”лицето на двете фигури=”<<lice(x,y)<<”n”;

   }

Резултати от изпълнение

лицето на двете фигури=78.5

деструктор circle

деструктор tri

6

3. Член-функция на един клас – приятелска за друг клас

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

Общ вид:

class B;                            //заглавен ред на клас В

class А

    { //член-данни на класа А

      public:

      //декларации на член-функции на клас А

      void fun(B,B&);   //декларация на член-функция

    };

//дефиниции на член-функции на клас А

class B

    { //член-данни на класа B

      public:

      //декларации на член-функции на клас B

      friend void  А::fun(B,B&);    //декларация на приятелска

                                    //функция, член-функция на А

    };

//дефиниции на член-функции на клас B

void А::fun(B a,B &b)               //дефиниция на приятелска

   { ………………………………}                  //функция

7

Пример за умножение на вектор с матрица

#include <iostream.h>

class vect;

class matrix

   {  double mat[3][3];

      public:

      matrix(double t[3][3]); //декларация на конструктор

      vect prod(vect &);      //член-функция с параметър псевдоним

   };                         //и резултат обект от клас vect

matrix::matrix(double t[3][3])

   { for(int i=0;i<3;i++)

for(int j=0;j<3;j++)

mat[i][j]=t[i][j];

   }

class vect

   { double v[3];

     public:

     vect(double v1=0,double v2=0,double v3=0)  //конструктор

       { v[0]=v1;v[1]=v2;v[2]=v3; }

     friend vect matrix::prod(vect &);    //декларация на приятелска

                                          //функция, член-функция на

     void out();                          //класа matrix

   };

void vect::out()

   { for(int i=0;i<3;i++) cout<<v[i]<,” “;

     cout<<”n”;

   }

vect matrix::prod(vect &x)          //дефиниция на член-функция

   { vect temp;                     //prod

     double sum;

     for(int i=0;i<3;i++)

      { for(int j=0,sum=0;j<3;j++)

            sum+=mat[i][j]*x.v[j];

        temp.v[i]=sum;

      }

     return temp;

   }

void main()                               Резултати от изпълнение

   {  vect w(1,2,3);,res;                 14 32 50                      double m[3][3]={1,2,3,4,5,6,7,8,9};

      matrix a=m;

      res=a.prod(w);

      res.out();

   }

8

Задача:

Да се състави програма за обслужване на БОЛНИЦА. Необходимата информация за болен пациент включва: име, година на раждане, местоживеене, дата на постъпване в болницата и диагноза на заболяването. Например:

 

Име Година

на раждане

Место-живеене Дата на

Постъпване

Диагноза
Петър Иванов 1980 Видин 22.02.2003 Язва

 

Програмата да дава възможност за получаване на следните резултати:

  1. Извежда списък на пациентите
  2. Отпечатва списък на всички пациенти по азбучен ред на имената им.(използвайте приятелска функция)

 

9
This free e-book was created with
Ourboox.com

Create your own amazing e-book!
It's simple and free.

Start now

Ad Remove Ads [X]
Skip to content