Язык программирования C++. Вводный курс




Конвертеры - часть 3


/p>

};

Семантика конвертера Token::operator string() состоит в возврате копии значения (а не указателя на значение) строки, представляющей имя лексемы. Это предотвращает случайную модификацию закрытого члена name класса Token.

Должен ли целевой тип точно соответствовать типу конвертера? Например, будет ли в следующем коде вызван конвертер int(), определенный в классе Token?

extern void calc( double );

Token tok( "constant", 44 );

// Вызывается ли оператор int()? Да

// применяется стандартное преобразование int --> double

calc( tok );

Если целевой тип (в данном случае double) не точно соответствует типу конвертера (в нашем случае int), то конвертер все равно будет вызван при условии, что существует последовательность стандартных преобразований, приводящая к целевому типу из типа конвертера. (Эти последовательности описаны в разделе 9.3.) При обращении к функции calc()

вызывается Token::operator int() для преобразования tok из типа Token в тип int. Затем для приведения результата от типа int к типу double

применяется стандартное преобразование.

Вслед за определенным пользователем преобразованием допускаются только стандартные. Если для достижения целевого типа необходимо еще одно пользовательское преобразование, то компилятор не применяет никаких преобразований. Предположим, что в классе Token не определен operator int(), тогда следующий вызов будет ошибочным:

extern void calc( int );

Token tok( "pointer", 37 );

// если Token::operator int() не определен,

// то этот вызов приводит к ошибке компиляции

calc( tok );

Если конвертер Token::operator int() не определен, то приведение tok к типу int

потребовало бы вызова двух определенных пользователем конвертеров. Сначала фактический аргумент tok

надо было бы преобразовать из типа Token в тип SmallInt с помощью конвертера

Token::operator SmallInt()

а затем результат привести к типу int – тоже с помощью пользовательского конвертера

Token::operator int()




Содержание  Назад  Вперед