Дружественные функции

Язык C++ / Дружественные функции

Иногда требуется, чтобы функция – не член класса, имела доступ к скрытым членам класса. Основная причина использования таких функций состоит в том, что некоторые функции нуждаются в привилегированном доступе более, чем к одному классу. Такие функции получили название дружественных.

Для того, чтобы функция – не член класса имела доступ к private-членам класса, необходимо в определение класса поместить объявление этой дружественной функции, используя ключевое слово friend. Объявление дружественной функции начинается с ключевого слова friend и должно находиться только в определении класса.

void func() {...}
class A {
...
friend void func();
};

Дружественная функция, хотя и объявляется внутри класса, функцией-членом не является. Поэтому не имеет значения, в какой части тела класса (private, public) она объявлена.

Функция-член одного класса может быть дружественной для другого класса.

class A
{...
  int func();
};
class B
{...
  friend int A :: func();
};

Функция-член func() класса A является дружественной для класса B.
Если все функции-члены одного класса являются дружественными функциями второго класса, то можно объявить дружественный класс:
friend class ИмяКласса;

class A {
...
};
class B
{...
  friend class A;
};

Все функции-члены класса А будут иметь доступ к скрытым членам класса В.

Пример Рассмотрим классы

  • vect – одномерный массив;
  • matrix – двумерный массив.

Необходимо написать функцию умножения вектора на матрицу. Такая функция должна иметь доступ к закрытым членам обоих классов. Это будет функция, дружественная обоим классам. Так как объявление дружественной функции появляется в обоих классах, и в качестве типов аргументов используется каждый класс, необходимо предварительное объявление (прототип) одного из классов перед определением другого.

Например класса matrix перед vect.

#include <iostream>
using namespace std;
class matrix; // прототип класса matrix
class vect {
  int *p;
  int size;
public:
  vect(int s=0) {
    p = new int[s];
    for(int i=0;i<s;i++)
       p[i] = 0;
    size = s;
  }
  void in(void) {
    for(int i=0;i<size;i++)
     {
      cout << "vect[" << i << "]=";
      cin >> p[i];
     }
  }
  void out(void) {
    cout << "vect: ";
    for(int i=0; i<size; i++)
       cout << p[i] << " ";
  }
  friend vect mult(const vect &, const matrix &);
};
class matrix {
  int **base;
  int column_size, row_size;
public:
  matrix(int col=0, int row=0) {
    base = new int*[row];
    for(int i=0; i<row; i++) {
       base[i] = new int[col];
       for(int j=0;j<col;j++)
           base[i][j] = 0;
     }
    column_size = col;
    row_size = row;
  }
void in(void) {
   for(int i=0;i<row_size;i++)
     for(int j=0;j<column_size;j++)
      {
       cout << "matrix[" << i << "][" << j << "]= ";
       cin >> base[i][j];
      }
}
void out(void) {
    cout << "matrix: " << endl;
    for(int i=0;i<row_size;i++) {
      for(int j=0;j<column_size;j++)
         cout << base[i][j] << " ";
      cout << endl;
    }
}
friend vect mult(const vect &, const matrix &);
};
vect mult(const vect &v, const matrix &m) {
  int i, j;
  vect rez(m.column_size);
  if(v.size!=m.row_size) {
    cout << "No rezult " << endl;
    return(rez);
  }
 for(j=0; j<m.row_size; j++) {
  rez.p[j]=0;
    for(i=0; i<m.row_size; i++)
        rez.p[j]+=v.p[i]*m.base[i][j];
 }
  return(rez);
}
int main() {
  vect v(3);
  matrix m(2,2);
  v.in();
  m.in();
  v.out();
  cout << endl;
  m.out();
  vect r= mult(v,m);
  r.out();
  cin.get(); cin.get();
  return 0;
}

Результат выполнения
Тип данных вектор
Назад

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *