Подтвердить что ты не робот

Что такое функция "operator int"?

Какова функция "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++;
   }
};
4b9b3361

Ответ 1

Полужирный код является оператором преобразования. (AKA оператор трансляции)

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

Например, с оператором преобразования этот код будет скомпилирован:

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

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

INT i(1234);
int i_2 = i.a;  // this wont compile because a is private

Ответ 2

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.

Ответ 3

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

Является ли это домашней проблемой?

Ответ 4

Прежде всего:

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

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

Поэтому следующий код корректно сформирован:

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, не имеющий параметров с имя формы [...]

оператор-тип-идентификатор оператора

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

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

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

Ответ 5

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

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

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