Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 10

printf (" Имя ребенка % s \n", name_children);
 
}
 
 };
 
 void main ( )
 
{
 
 man a;
 
 a.get_info_man ("a");
 
 kum b; 
 
 b.get_kum_info ( );
 
 b.kuma (a);
 
 }

Следует обратить внимание, что функция-член kuma( ) должна быть описана после спецификатора public, так как иначе b . kuma( a ) выполнить невозможно.

19.1.3 Правила по отношению к друзьям

  • На описание friend не действуют спецификаторы public ,protected ,private.
  • Описание friend не взаимное: если А объявляет В другом, то это не означает, что А является другом для В.

Дружественность не наследуется. Если А объявляет В другом, то классы, производные от А, не будут автоматически признавать дружественность В.

Перегруженные операции

Для типов float ,double ,int ,long определены операции +-*/%+=-= и др. Но для типов, которые получены с помощью классов, эти операции надо реализовать самостоятельно. С этой целью можно было бы применить

функции-члены, например: plus ( ) для сложения, plusequal ( ) для += и т.д. Но это неудобно. Значительно лучше применить общеупотребительные знаки ++= и прочие.А для этого надо перегрузить упомянутые или другие операции для объектов описанного класса.

Перегрузить можно любую операцию, кроме следующих:.,.*,::?:.

Это можно сделать двумя способами:

1.  С помощью перегруженных операторов - функций, которые являются членами класса;

2.  С помощью перегруженных функций, которые являются friend (дружественными функциями) для данного класса.

Рассмотрим первый способ. В этом случае синтаксис для перегруженной операции имеет вид:

имя _класса&operator операция (имя _класса& параметр)

Рассмотрим пример для перегруженной операции += для комплексных чисел.

 #include <stdio.h>

 class comp

{

 float Re, Im;

 public:

 comp (float a, float b)

{

 Re=a;

 Im=b;

}

 comp& operator += (comp& x)

{

 Re+=x.Re;

 Im+=x.Im;

 return *this;

}

 void put_info (char *Str)

{

 printf ("%s.Re=%f%s.Im=%f\n", Str, Re, Str, Im);

}

};

 void main ( )

{

 comp C1 ( 2, -2), C2 (-2, 2);

 C1+=C2;

 C1.put_info ("C1");

}

В результате перегруженной операции += значение С1 изменится. Ее адрес при вызове операции += был передан в this. Второй параметр был передан в качестве фактического параметра вместо формального х. Результат возвращается через * this. Если нужно сложить два комплексных числа и при этом оставить их значения без изменений, можно использовать второй способ перегрузки операции с помощью дружественной функции. Для этого примера прототип такой функции следующий:

friendcompoperator+( comp &C 1, comp &C 2);

Необходимо еще раз обратить внимание на то, что эта функция не являеться членом класса. Программа для этого случая следующая:

 #include <stdio.h>

classcomp

{

float Re, Im;

 public:

 comp (float a, float b)

{

 Re=a;

 Im=b;

}

 comp ( )

{

}

 friend comp operator + (comp &C1, comp&C2);

 void put_info (char *Str)

{

 printf ("%s.Re=%f%s.Im=%f\n", Str, Re, Str, Im);

}

};

 void main ()

{

 comp C1 ( 2, -2), C2 (-2, 2);

 comp C3;

 C3=C1+C2;

 C3.put_info ("C3");

}

 comp operator +(comp &C1, comp&C2);

{

 comp V;

 V.Re=C1.Re + C2.Re;