logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.12.3.2 Функции преобразования

Функция-член класса X, имя которой имеет вид,

имя-функции-преобразования:

operator имя-типа-преобразования

имя-типа-преобразования:

список-спецификаций-типа opt операция-ptr opt

задает преобразование из типа X в тип, определяемый конструкцией

имя-типа-преобразования. Такие функции-члены называются функциями

преобразования. В конструкции список-спецификаций-типа нельзя

описывать классы, перечисления и имена-typedef, а также нельзя

задавать типы формальных параметров и тип возвращаемого значения.

Приведем пример:

class X {

// ...

public:

operator int();

};

void f(X a)

{

int i = int(a);

i = (int)a;

i = a;

}

Здесь во всех трех операторах присваиваемое значение будет

преобразовываться с помощью функции X::operator int(). Пользовательские

преобразования не ограничиваются только использованием в присваивании

и инициализации, например:

void g(X a, X b)

{

int i = (a) ? 1+a : 0;

int j = (a&&b) ? a+b : i;

if (a) { // ...

}

}

Операции преобразования наследуются. Функции преобразования

могут быть виртуальными.

К данному значению неявно применяется не более одного

пользовательского преобразования (с помощью конструктора или функции

преобразования), например:

class X {

// ...

public:

operator int();

};

class Y {

// ...

public:

operator X();

};

Y a;

int b = a; // недопустимо: преобразование

// a.operator X().operator int() не применяется

int c = X(a); // нормально: a.operator X().operator int()

Пользовательские преобразования осуществляются неявно только

при условии их однозначности. Функция преобразования производного

класса не закрывает функцию преобразования базового класса, если

только они не преобразуют к одному и тому же типу, например:

class X {

public:

// ...

operator int();

};

class Y : public X {

public:

// ...

operator void*();

};

void f(Y& a)

{

if (a) { // ошибка: неоднозначность

}

}