Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lucik_op.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.88 Mб
Скачать

Преобразования типов, определенных в программе

Конструктор с одним аргументом можно явно не вызывать.

#include "iostream.h"

class my_class

{ double x,y; //

public:

my_class(double X){x=X; y=x/3;}

double summa();

};

double my_class::summa() { return x+y; }

void main()

{ double d;

my_class my_obj1(15), // создание объекта obj1 и инициализация его

my_obj2=my_class(15), // создание объекта obj2 и инициализация его

my_obj3=15; // создание объекта obj3 и инициализация его

d=my_obj1; // error no operator defined which takes a right-hand operand of

// type 'class my_class' (or there is no acceptable conversion)

cout << my_obj1.summa() << endl;

cout << my_obj2.summa() << endl;

cout << my_obj3.summa() << endl;

}

В рассматриваемом примере все три создаваемых объекта будут инициализированы числом 15 (первые два явным, третий неявным вызовом конструктора). Следовательно, значение базовой переменной (определенной в языке) может быть присвоено переменной типа, определенного пользователем.

Для выполнения обратных преобразований, то есть от переменных, имеющих тип, определенный пользователем к базовому типу, можно задать преобразования с помощью соответствующей функции operator(), например:

class my_class

{ double x,y;

public:

operator double() {return x;}

my_class(double X){x=X; y=x/3;}

double summa();

};

Теперь в выражении d=my_obj1 не будет ошибки, так как мы задали прямое преобразование типа. При выполнении этой инструкции активизируется функция operator, преобразующая значение объекта к типу double и возвращающая значение компоненты объекта . Наряду с прямым преобразованием в С++ имеется подразумеваемое преобразование типа:

#include "iostream.h"

class my_cl1

{ double x; //

public:

operator double(){return x;}

my_cl1(double X) : x(X) {}

};

class my_cl2

{ double x; //

public:

operator double(){return x;}

my_cl2(my_cl1 XX): x(XX) {}

};

void fun(my_cl2 YY)

{ cout << YY <<endl; }

void main()

{ fun(12); // ERROR cannot convert parameter 1

// from 'const int' to 'class my_cl2'

fun(my_cl2(12)); // подразумеваемое преобразование типа

}

В этом случае для инструкции fun(my_cl2(12)) выполняется следующее:

активизируется конструктор класса my_cl1 (x инициализируется значением 12);

при выполнении в конструкторе my_cl2 инструкции x(XX) вызывается функция operator (класса my_cl1), возвращающая значение переменной x, преобразованное к типу double;

далее при выполнении инструкции cout << YY вызывается функция operator() класса my_cl2, выполняющая преобразование значения объекта YY к типу double.

Разрешается выполнять только одноуровневые подразумеваемые преобразования. В приведенном выше примере инструкция fun(12) соответствует двухуровневому неявному преобразованию, где первый уровень - my_cl1(12) и второй - my_cl2(my_cl1(12))

В заключение отметим основные правила доопределения операторов:

- все операторы языка С++ за исключением . * :: ?: sizeof и символов # ## можно доопределять;

- при вызове функции operator используется механизм перегрузки функций;

- количество операндов, которыми оперируют операторы (унарные, бинарные), и приоритет операций сохраняются и для доопределенных операторов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]