Функция operator+() не воздействует непосредственно на представление вектора. Действительно, она не может этого делать, поскольку не является членом. Однако иногда желательно дать функциям не членам возможность доступа к закрытой части класса. Например, если бы не было функции "доступа без проверки" vector::elem(), вам пришлось бы проверять индекс i на соответствие границам три раза за каждый проход цикла. Здесь мы избежали этой сложности, но она довольно типична, поэтому у класса есть механизм предоставления права доступа к своей закрытой части функциям не членам. Просто в описание класса помещается описание функции, перед которым стоит ключевое слово friend. Например, если имеется
class Vec; // Vec - имя класса
class vector { friend Vec operator+(Vec, Vec); //... };
То вы можете написать
Vec operator+(Vec a, Vec b) { int s = a.size(); if (s != b.size()) error("плохой размер вектора для +"); Vec& sum = *new Vec(s); int* sp = sum.v; int* ap = a.v; int* bp = b.v; while (s--) *sp++ = *ap++ + *bp++; return sum; }
Одним из особенно полезных аспектов механизма friend является то, что функция может быть другом двух и более классов. Чтобы увидеть это, рассмотрим определение vector и matrix, а затем определение функции умножения.
8 8 8
| |