Урок 140. Перегрузка операций преобразования типов данных

   ⁄ 

 Обновлено 29 Апр 2018  ⁄ 

⁄   915

Как мы уже знаем из урока о неявном преобразовании типов данных, C++ позволяет конвертировать значения из одного типа данных в другой. Например, преобразуем значение типа int в значение типа double:

C++ по умолчанию знает, как выполнять приведения (преобразования) встроенных типов данных. Однако он не знает, как выполнять конвертацию с пользовательскими типами данных, например, классами. Именно здесь вступает в игру перегрузка операций преобразования типов данных.

Рассмотрим следующий класс:

Класс Dollars содержит некое количество долларов в виде целого числа (переменная-член m_dollars) и предоставляет функции доступа для получения и установления значения m_dollars. В нем также есть конструктор для конвертации значений типа int в тип Dollars (при создании объекта пользователь передаёт в качестве аргумента значение типа int, которое затем преобразуется в значение типа Dollars).

Если мы можем конвертировать int в Dollars, то логично было бы, чтобы мы могли конвертировать и Dollars обратно в int, не так ведь? Иногда это может быть полезным.

В следующем примере мы используем getDollars() для конвертации значения типа Dollars в тип int для его последующего вывода через printInt():

Согласитесь, вызывать каждый раз getDollars() не очень удобно. Было бы проще перегрузить операцию преобразования значений типа Dollars в тип int. Делается это следующим образом:

Здесь есть две вещи, на которые следует обратить внимание:

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

  Функция перегрузки не имеет типа возврата. C++ предполагает, что вы будете возвращать корректный тип.



Теперь printInt() вызывается проще:

Сначала компилятор видит, что функция printInt должна принимать целочисленный параметр (из определения printInt). Тогда он видит, что переменная dollars не является типа int. Он смотрит, предоставили ли мы способ конвертации значения типа Dollars в тип int. Так как это у нас есть, то вызывается operator int(), который возвращает значение типа int, и это значение передается в printInt().

Теперь мы можем явно конвертировать объект класса Dollars в тип int:

Вы можете перегружать операции преобразования любых типов данных, включая ваших собственных (пользовательских) типов данных!

Например, вот класс Cents, в котором осуществлена перегрузка операции преобразования значения типа Cents в значение типа Dollars:

Таким образом мы можем напрямую конвертировать центы в доллары:

Результат выполнения программы выше:

7

Всё логично: 700 центов = 7 долларов!

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (15 оценок, среднее: 5,00 из 5)
Загрузка...
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО