C++   ::   Хилл Мюррей

Страница: 179 из 357

При каждом обращении к multiply() elem() будет взываться 4*(1+4*3) раза.

Теперь, если мы сделаем multiply() членом класса vector, мы сможем обойтись без проверки индексов при обращении к элменту вектора, а если мы сделаем multiply() членом класса matrix, то мы сможем обойтись без проверки индексов при обрщении к элементу матрицы. Однако членом двух классов функция быть не может. Нам нужно средство языка, предоставляющее функции право доступа к закрытой части класса. Функция не член, получившая право доступа к закрытой части класса, назвается другом класса (friend). Функция становится другом класса после описания как friend. Например:

class matrix;

class vector (* float v[4]; // ... friend vector multiply(matrix amp;, vector amp;); *);

class matrix (* vector v[4]; // ... friend vector multiply(matrix amp;, vector amp;); *);

Функция друг не имеет никаких особенностей, помимо права доступа к закрытой части класса. В частности, friend функция не имеет указателя this (если только она не является полноравным членом функцией). Описание friend – настоящее описние. Оно вводит имя функции в самой внешней области видимости

программы и сопоставляется с другими описаниями этого имени. Описание друга может располагаться или в закрытой, или в отрытой части описания класса. Где именно, значения не имеет.

Теперь можно написать функцию умножения, которая исползует элементы векторов и матрицы непосредственно:

vector multiply(matrix amp; m, vector amp; v); (* vector r; for (int i = 0; i«3; i++) (* // r[i] = m[i] * v; r.v[i] = 0; for (int j = 0; j«3; j++) r.v[i] += m.v[i][j] * v.v[j]; *) return r; *)

Есть способы преодолеть эту конкретную проблему эффе

|< Пред. 177 178 179 180 181 След. >|

Java книги

Контакты: [email protected]