Что такое функция "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++;
}
};
Ответы
Ответ 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++;
};