39

下面的“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++;
   }
};
4

5 回答 5

39

粗体代码是转换运算符。(又名演员运算符

它为您提供了一种将自定义INT类型转换为另一种类型(在本例中int为 )的方法,而无需显式调用特殊的转换函数。

例如,使用转换运算符,此代码将编译:

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

如果没有转换运算符,上面的代码将无法编译,您必须执行其他操作才能从 anINT转到 an int,例如:

INT i(1234);
int i_2 = i.a;  // this wont compile because a is private
于 2010-09-28T16:44:48.173 回答
17

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.
于 2010-09-28T16:46:04.007 回答
6

第一件事:

$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 类的成员函数,没有参数,名称为 [...]

运算符转换类型 ID

[...] 指定从 X 到转换类型 ID 指定的类型的转换。此类函数称为转换函数。不能指定返回类型。如果转换函数是成员函数,则转换函数的类型(8.3.5)是“不带参数返回转换类型ID的函数”。

这使得以下所有格式良好,并与内置类型的工作方式保持一致

int y1 = i; // copy initialization or
int y2(i);  // direct initialization
double d = (int )i; // explicit cast
于 2010-10-05T02:11:51.383 回答
3

看起来它创建了一个行为有点像常规 int 的 INT 类,只是还没有定义其他一些运算符。

这是作业问题吗?

于 2010-09-28T16:22:32.070 回答
2

好像是课堂上的问题,所以我会邀请您查看有关如何创建课程的文档。

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

    Foo operator++ {} // Operation ++ on foo like:
    // Foo foo;
    // foo++;
};
于 2010-09-28T16:25:25.670 回答