Перегрузка оператора приведения типа

При создании классов-обёрток иногда требуется приводить их к более простым типам. Для упрощения этой операции можно перегрузить оператор приведения типа.

Общий синтаксис оператора приведения типа выглядит так:

operator new_type () const;

где new_type — тип, к которому осуществляется приведение. Оператор должен возвращать значение этого типа.

Ниже приводится пример программы, демонстрирующей его использование.

#include <stdio.h>

class Integer
{
public:
  operator int () const {return val_;}; 

  Integer(int val = 0) : val_(val) {};		
  
private:
  int val_;	
};

int main()
{
  Integer a(5);
  printf("%d\r\n", static_cast<int>(a));

  return 0;
};

Если бы мы не перегрузили оператор приведения типа, то при попытке скомпилировать этот пример мы бы получили сообщение об ошибке:

invalid static_cast from type ‘Integer’ to type ‘int’

Благодаря перегруженному оператору приведения типа компилятор может автоматически конвертировать Integer в int. Поэтому нам нужно быть предельно внимательными. Например, у нас есть две функции:

void foo(Integer);
void foo(int);

Если они имеют разную реализацию, то нужно внимательно следить за тем, какая функция и когда вызывается. Если же они имеют сходную реализацию, то можно написать только одну из них. Причем не важно какую именно.

Для конвертирования типа int в Integer вызывается конструктор последнего. А для обратного конвертирования Integer в int — оператор приведения типа. Причем все эти вызовы компилятор делает автоматически.

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

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