下面的“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++;
}
};
答案 0 :(得分:26)
粗体代码是转换运算符。 (AKA cast operator)
它为您提供了一种从自定义INT
类型转换为其他类型(在本例中为int
)的方法,而无需明确调用特殊转换函数。
例如,使用convert运算符,此代码将编译:
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
答案 1 :(得分:16)
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.
答案 2 :(得分:4)
看起来它使INT类的行为与常规int类似,只是还没有定义其他一些运算符。
这是作业问题吗?
答案 3 :(得分:4)
首先要做的事情:
$ 12.3.1 / 1 - “声明了一个构造函数 没有函数说明符 explicit指定从的转换 它的参数类型 它的类的类型。这样的构造函数 被称为转换构造函数。“
在您的示例中,INT是一个User Defined类,它具有来自'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 - “a。的成员函数 类X没有参数a 表格的名称[...]
运营商conversion-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 :(得分:2)
好像这是教室里的一个问题,所以我邀请你查看有关如何创建课程的文档。
class Foo
{
public
Foo() {} // Constructor
Foo operator++ {} // Operation ++ on foo like:
// Foo foo;
// foo++;
};