{
goods top [5] ={ { “Костюм “, 10000}, { “Шляпа”, 1100 } };
// инициализация двух объектов из пяти при объявлении массива объектов
for (int i =2; i <5; i++) top [i].vvod();
// вводятся данные в объекты массива с помощью компонентной функции
for(i =0; i<5; i++) top[i].vivod; // выводятся данные о товарах
goods::SetPer(30);
// присваивается другое значение статическому компоненту
good* ptr = top; // объявлен указатель на объект класса и инициирован
адресом первого элемента массива (экв. &top[0])
for(i=0; i <5; i++)
ptr++ -> vivod(); // после каждого вызова функции указатель
} //”настраивается” на следующий элемент
Друзья классов
Защищенные компоненты (protected) доступны внутри класса и в производных классах.
Собственные компоненты (private) локализованы в классе и не доступны извне.
Через общедоступные компоненты (public) осуществляется взаимодействие класса с любыми частями программы.
Не редко возникает необходимость использования, каких либо внешних по отношению к классу функций общего назначения для обработки закрытых данных класса, при этом эти функции не могут быть методами класса.
В С++ предусмотрена возможность обойти это ограничение путем объявления в классе дружественных функций, или функций – друзей класса.
Таким образом, расширить интерфейс класса позволяют дружественные функции.
Дружественной функцией класса называют функцию, которая не является компонентной функцией класса, но имеет доступ к защищенным и собственным компонентам класса.
Дружественная функция
1) должна быть описана в теле класса соспецификатором friend;
2) не может быть компонентной функцией класса, в котором она определена
как дружественная;
3)может быть глобальной: class A { friend void f(…); … };
void f (…) { …}
4) может быть компонентной функцией другого ранее определенного класса;
и тогда при описании в классе надо использовать полное имя функции, включающее имя класса, которому она принадлежит:
class A { … void f1(…); …};
class B { … friend void A:: f1(…); …};
5) может быть дружественной по отношению к нескольким классам
class A; // опережающее описание класса
class B { …friend void ff (A, B); …};
class A { …friend void ff (A, B); …};
void ff (A tip1, B tip2) { тело функции}
Рассмотрим методику работы с дружественными функциями класса комплексных чисел. Такой класс входит в пакет Borland C++ (файл complex.h), мы построим свой класс (упрощенный)
//Класс комплексных чисел
#include <iostream.h>
#include <math.h>
class Complex {
float re, im;
public:
void define (float, float); // функция для определения значения комп. числа
float real (); //функция для получения действительной части
float image(); //функция для получения мнимой части
float mod (); //функция для получения модуля числа
Complex sum (Complex); //функция для получения суммы двух
//комплексных чисел
};
void Complex:: define (float _re, float _im)
{ re = _re; im = _im;}
float Complex:: real ()
{ return re; }
float Complex:: image ()
{ return im; }
float Complex:: mod ()
{ return sqrt (re*re + im* im); }
Complex Complex:: sum (Complex z)
{ z. re + = re;
z. im + = im;
return z; }
void main () {
Complex c1, c2, c3;
c1.define(3, 4); c2.define(5, 6); c3.define(0, 0);
float m= c1.mod();
cout<< ‘\n’<< m;
c3 = c1.sum(c2);
cout<<’\n’<< “ sum:” <<c3.real();
(c3.image()<0)? cout<< c3.image ()<< ‘i’: cout<< ‘+’ <<c3.image()<<’i’;
}
Рассмотрим функцию суммирования. В качестве своего аргумента она принимает объект с2 класса Complex:
c3 = c1.sum(c2);
причем этот объект передается по значению, т.е. создается локальная копия с2 в стеке с именем z. Сам объект с2 в функции меняться не будет, а формируется временный объект z из данных объекта с2 и данных объекта с1
z.re += re;
z.im+= im;
Этот временный объект z существует, пока выполняется функция, и передается (копируется) в объект с3 по завершению работы функции.
Рассмотрим строчку еще раз
c3 = c1.sum(c2);
хотя слагаемые суммы c1 и c2 равнозначны, запись не симметрична, естественно было бы вызывать функцию так:
с3= sum(c1,c2);
Однако при использовании функций-членов это не возможно: нельзя вызывать функцию без указания объекта, для которого она вызывается.
Такую форму можно реализовать, если определить функцию sum, как дружественную.
#include <iostream.h>
#include <math.h>
class Complex {
float re, im;
public:
void define (float, float); // компонентная функция для определения
// значения комп. числа
friend float real (Complex); //функция- друг для получения
// действительной части
friend float image(Complex); //функция – друг для получения
// мнимой части
friend float mod (Complex); //функция-друг для получения модуля числа
friend Complex sum (Complex, Complex); //функция – друг для
// получения суммы двух комплексных чисел
};
void Complex:: define (float _re, float _im)
{ re = _re; im = _im;}






