Конструкторы преобразований
Если конструктор класса А воспринимает единственный аргумент типа В, то говорят, что В может быть приведен к А с помощью преобразования конструктором. Другими словами, компилятор может использовать конструктор класса А с аргументом типа В, чтобы получить А из В. Сказанное рассмотрим на примере комплексных чисел.
Пример.
class comp
{
float Re, Jm;
public:
comp (float a, float b)
{
Re = a;
Jm = b;
}
comp ( float a )
{
Re = a;
Jm = Ø;
}
comp ( )
{
}
};
void main ( )
{
float r = 96;
comp a(2, -2), b = r;
comp c;
c = b;
}
При создании объекта а вызывается конструктор с двумя параметрами.
В результате a. Re = 2
a. Jm = -2.
Затем вызывается конструктор с одним параметром. Создается объект b c элементами данных b. Re = 96
b. Jm = Ø.
Из объекта r типа float с помощью конструктора создан объект класса comp.
При создании объекта c вызывается «пустой» конструктор. Далее в результате присваивания будет получено
с. Re = 96
с. Jm = Ø.
Операция приведения
Это функции–элементы класса, которые осуществляют явное преобразование типа класса к другому типу. Они имеют следующий вид:
Оperator имя_нового_типа ( )
{
: : : :
}
Вызов: имя_нового_типа (имя_объекта_класса);
Операторы приведения подчиняются следующим правилам:
1) Не имеют формальных аргументов; Считается по умолчанию, что это имя объекта данного класса.
2) Нет явного описания типа возвращаемого результата. Считается, что тип результата тот, к которому приводит оператор приведения.
3) Может описываться как virtual.
4) Наследуется.
Пример.
# include < stdio. h>
class A
{
int k;
char * str;
public:
A (int a, char * s)
{
k = a
str = s;
}
operator int ( )
{
return k;
}
};
void, main ( )
{
A q (12, “Coretta”);
printf (“Целая часть для q = % i \ n “, int (q);
}
В описании класса А определена функция-элемент этого класса operator int ( ). Она преобразует объект q класса А в переменную типа int. Это происходит в результате вызова операции приведения int (q). Подобным образом можно преобразовать объект класса А в переменную (объект) типа char.
Лекция 19
19.1 Друзья
Язык С++ разрешает использовать в качестве аргументов объекты одного класса другому классу или функции, которая не является членом этого класса. Для этого используется ключевое слово friend.
Дружественные функции
Можно разрешить обычной функции или функции – элементу другого класса пользоваться объектами класса , который объявил эту функцию дружественной с помощью описания friend при определении класса. То есть при определении класса приводится прототип дружественной функции, перед которым стоит слово friend. Ниже приводится пример дружественной функции kuma (man&), у которой в качестве аргумента является ссылка на класс man. Класс man объявил функцию kuma ( ) дружественной для себя.
# include <stdio.h>
Class man
{
char name [20];
char adres [25];
public:
friend void kuma (man& x);
Void get_info ( );
Void put_info ( );
};
void man :: get_info ( )
{
puts (“Введите имя”);
Fflush (stdin);
scanf (“%s”, &name);
puts (“Введите адрес”);
Fflush (stdin);
scanf (“%s”, &adres);
}
void man :: put_info ( )
{
printf (“Имя %s, адрес %s \n”, name, adres);
}
Void main ( )
{
Man V;
V.get_info ( );
V.put_info ( );
Kuma (V);
}
void kuma (man& x)
{
printf (“Я кума у %s. Его адрес %s \n”, х.name, х.adres);
}
Дружественные классы
При определении класса можно объявить другой класс в качестве друга. Такое объявление выглядит так:
Friend class имя_дружественного_класса;
При этом слово class можно не писать.
Благодаря этому объявлению функции-члены дружественного класса могут использовать в качестве аргумента объекты того класса, который объявил его другом.
В приведенном ниже примере в классе man объявлен в качестве дружественного класс kum.
Функция-элемент kum () класса kum использует объект класса man.
# include <stdio.h>
Class man
{
char name [10];
public:
friend class kum; // classможно не писать
void get_info_man (char* nm)
{
printf (“Введите имя для %s \n”, nm);
Fflush (stdin);
scanf (“%s”, &name);
}
};
Class kum
{
char name_children [15];
public:
Void get_kum_info ( );
{
puts (“Введите имя ребенка”);
Fflush (stdin);
scanf (“%s”, &name_children);
}
void kuma (man& x)
{
printf (“У меня есть кум %s \n”, х.name);
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) выполнить невозможно.