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

Язык 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;
};


Все методы класса A будут иметь доступ к скрытым членам класса B.

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#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 row = 0, int col = 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(3, 2);
  v.in();
  m.in();
  v.out();
  cout << endl;
  m.out();
  vect r = mult(v, m);
  r.out();
  cin.get(); cin.get();
  return 0;
}


Результат выполнения
Дружественная функция умножения вектора на матрицу


Назад: Язык C++

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

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