"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора

for (int i = 0; i

void error(char* p) {
cerr << p << "\n";
exit(1);
}

void vector::set_size(int) { /*...*/ }

int& vec::operator[](int i) { /*...*/ }

main()
{
Vec a(10);
Vec b(10);
for (int i=0; i
1.15 Друзья (friend)

Функция operator+() не воздействует непосредственно на
представление вектора. Действтельно, она не может этого делать,
поскольку не является членом. Однако иногда желательно дать
функциям не членам возможность доступа к закрытой части класса.
Например, если бы не было функции "доступа без проверки"
vector::elem(), вам пришлось бы проверять индекс i на соответствие
границам три раза за каждый проход цикла. Здесь мы избежали этой
сложности, но она довольно типична, поэтому у класса есть механизм
предоставления права доступа к своей закрытой части функциям не
членам. Просто в описание класса помещается описание функции, перед
которым стоит ключевое слово friend. Например, если имеется

class Vec; // Vec - имя класса

class vector {
friend Vec operator+(Vec, Vec);
//...
};

- стр 43 -

То вы можете написать

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++;