Void main (void). //инициализация двух объектов из пяти при объявлении массива объектов

{

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




double arrow
Сейчас читают про: