8.5.6 Преобразования

We use cookies. Read the Privacy and Cookie Policy

8.5.6 Преобразования

Конструктор, получающий один параметр, определяет преоразование из типа своего параметра в тип своего класса. Такие преобразования неявно применяются дополнительно к стандартным пробразованиям (#6.6-7). Поэтому присваивание объекту из класса X допустимо, если тип T присваиваемого значения есть X, или если было описано преобразование из T в X. Аналогично конструкторы используются для преобразования инициализаторов (#8.6), параметров функции (#7.1) и возвращаемых функцией значений (#9.10). Например:

class X (* ... X (int); *); f (X arg) (* X a = 1; // a = X (1) a = 2; // a = X (2) f (3); // f (X (3)) *)

Если ни один конструктор для класса X не получает приваиваемый тип, то не делается никаких попыток отыскать другие конструкторы для преобразования присваиваемого значения в тип, который мог бы быть приемлем для конструкторов класса X. Например: class X (* ... X (int); *); class X (* ... Y (X); *); Y a = 1; // недопустимо: Y (X (1)) не пробуется Функция член класса X с именем вида имя_функции_преобразования:

operator тип

задает преобразование из X в тип. Тип не может содержать описания [] «вектор из» или () «функция, возвращающая». Оно будет применяться неявно аналогично конструкторам выше (толко если оно единственно: #8.9), или его можно вызвать явно с помощью записи приведения к типу. Например:

class X (* // ... operator int(); *);

X a; int i = int(a); i = (int)a; i = a;

Во всех трех случаях значене будет преобразовываться функцией X::operator int(). Применение определяемых пользовтелем преобразований не сводится только к присваиваниям и инициализациям. Например:

X a, b; // ... int i = (a) ? 1+a : 0; int j = (a amp; amp;b) ? a+b : i;