从内置类型转换为自定义类

时间:2011-04-22 13:57:32

标签: c++ casting

我有一个自定义类,它充当一个名为Integer的int,我想告诉编译器如何自动将某些类型转换为Integer,这样我就可以避免一遍又一遍地输入相同的东西,

someCall(Integer(1), Integer(2));

会变成

someCall(1,2);

我用Google搜索了但是我能找到的只是做对话,将Integer强制转换为int我希望完成相反的操作。

3 个答案:

答案 0 :(得分:14)

编写一个带int的构造函数,如:

class Integer
{
   public:
       Integer(int);
};

如果类Integer具有此构造函数,则可以执行此操作:

void f(Integer);

f(Integer(1)); //okay 
f(1);          //this is also okay!

解释是,当您编写f(1)时,会自动调用Integer的构造函数,该构造函数采用类型为int的单个参数,并在运行时创建一个临时文件。然后临时传递给函数!


现在假设您想要完全相反,即将Integer类型的对象传递给函数需要int

 void g(int); //NOTE: this takes int!

 Integer intObj(1);
 g(intObj); //passing an object of type Integer?

要使上述代码正常工作,您只需在类中定义用户定义的转换函数:

class Integer
{
   int value;
   public:
       Integer(int);
       operator int() { return value; } //conversion function!
};

因此,当您将类型为Integer的对象传递给取int的函数时,将调用转换函数并将对象隐含转换为int,然后传递给函数作为论点。你也可以这样做:

int i = intObj; //implicitly converts into int
                //thanks to the conversion function!   

答案 1 :(得分:5)

您可以在Integer中为要隐式转换的类型定义构造函数。不要让他们explicit

答案 2 :(得分:4)

纳瓦兹给出了正确的答案。我只想指出一些问题。 如果转换运算符不是const,则无法转换const对象

const Integer n(5);
int i = n; // error because non-const conversion operator cannot be called

最好将转化运算符声明为

operator int() const {return value;}