Конструкторы преобразований

 

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

Пример.

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) выполнить невозможно.