Что такое функция "оператор int"? - PullRequest
30 голосов
/ 28 сентября 2010

Что такое функция operator int ниже? Что это делает?

class INT
{
   int a;

public:
   INT(int ix = 0)
   {
      a = ix;
   }

   /* Starting here: */
   operator int()
   {
      return a;
   }
   /* End */

   INT operator ++(int)
   {
      return a++;
   }
};

Ответы [ 5 ]

27 голосов
/ 28 сентября 2010

Код, выделенный жирным шрифтом, является оператором преобразования.(AKA оператор приведения )

Это дает вам возможность конвертировать из вашего пользовательского типа INT в другой тип (в данном случае int) без необходимости вызывать специальное преобразованиефункция явно.

Например, с помощью оператора convert этот код скомпилируется:

INT i(1234);
int i_2 = i; // this will implicitly call INT::operator int()

Без оператора convert приведенный выше код не скомпилируется, и вам придется выполнитьчто-то еще, чтобы перейти от INT к int, например:

INT i(1234);
int i_2 = i.a;  // this wont compile because a is private
16 голосов
/ 28 сентября 2010

operator int() - это оператор преобразования , который позволяет использовать этот класс вместо int.Если объект этого типа используется в месте, где ожидается int (или другой числовой тип), то этот код будет использоваться для получения значения правильного типа.

Например:

int i(1);
INT I(2); // Initialised with constructor; I.a == 2
i = I;    // I is converted to an int using `operator int()`, returning 2.
4 голосов
/ 05 октября 2010

Перво-наперво:

$ 12.3.1 / 1 - "Конструктор, объявленный без явного спецификатора функции, определяет преобразование типов его параметров в тип своего класса.конструктор называется конвертирующим конструктором. "

В вашем примере INT - это определяемый пользователем класс, который имеет конвертирующий конструктор из 'int'.

Поэтому следующий код хорошоFormed:

INT i(1024);     // direct initialization syntax

Это означает, что вы можете получить объект INT из целого числа.Однако что делать, если объект INT нужно преобразовать обратно в целое число?Транзитивность?

Можно сказать, что класс INT может предоставить функцию-член для возврата инкапсулированного целочисленного члена

int x = i.geta();

Это, однако, не очень интуитивно понятно и не является стандартизированным подходом.Кроме того, это не интуитивно понятно, когда речь идет о том, как встроенные типы работают в таких ситуациях.

int z = 0;
int y1 = z; // copy initialization or
int y2(z);  // direct initialization
double d = (int )z; // explicit cast

Поэтому Стандарт допускает такую ​​стандартизацию и интуитивность преобразования пользовательских типов, говоря:

$ 12.3 / 2 - "Функция-член класса X, не имеющая параметров с именем вида [...]

operator-type-id

[...] определяет преобразование из X в тип, указанный в ID-типе преобразования. Такие функции называются функциями преобразования. Тип возврата не может быть указан. Если функция преобразования является функцией-членом,тип функции преобразования (8.3.5) - «функция, не принимающая параметров, возвращающих ID-типа преобразования».

Это делает все следующее правильно сформированным, а сохраняет гармонию сспособ работы встроенных типов равен

int y1 = i; // copy initialization or
int y2(i);  // direct initialization
double d = (int )i; // explicit cast
4 голосов
/ 28 сентября 2010

Похоже, что он создает класс INT, который ведет себя немного как обычный int, просто некоторые другие операторы еще не определены.

Это домашняя проблема?

2 голосов
/ 28 сентября 2010

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

class Foo
{
public
    Foo() {} // Constructor

    Foo operator++ {} // Operation ++ on foo like:
    // Foo foo;
    // foo++;
};
...