2010-09-28 97 views
23

下面是什么“运算符int”函数?它有什么作用?什么是“运算符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

什么大胆的代码?否则,它基本上是'int'的一个包装,转换为'int'和运算符'++'。 – 2010-09-28 16:22:49

+3

查看原文的来源,'operator int()'应该是粗体代码。 – 2010-09-28 16:29:34

+6

如果可以的话,我会诚实地投票重新打开这个。原始问题的格式不佳,但有一段代码清晰粗体。稍后的编辑(不是由OP)是使代码变得粗体并因此使问题看起来不连贯的原因。 – eldarerathis 2010-09-28 16:31:42

回答

24

加粗的代码是一个转换运算符。 (AKA cast operator

它给你一个方法,从您的自定义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 
4

看起来它使这行为有点像普通的INT INT类,只是一些其他运营商尚未确定。

这是一个功课问题吗?

3

好像这是来自教室的问题,所以我会邀请您查看关于如何创建课程的文档。

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

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

operator int()转换运算符,这允许在代替要使用这个类10。如果在预期使用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

第一件事:

$ 12.3.1/1 - “构造函数声明 无功能符 明确规定了从 转换的类型它的参数为其类的 类型,这样的构造函数 被称为转换构造函数。“

在你的榜样,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 

THEREFOR标准允许这样的标准化和转换用户定义类型的直观性说:

$ 12.3/2 - “具有带 名称没有参数的 类X的成员函数形式的[...]

操作者转换型-ID

[ ...]指定从X转换为 conversion-type-id指定的 类型。这些功能是 称为转换功能。没有返回 类型可以指定。如果转换函数是成员函数,则转换函数 (8.3.5)的类型为“取不 参数返回 转换类型id”的函数。

这使得以下所有良好和保持和谐的方式内置工种

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