1、构造函数转换
如果定义一个构造函数,这个构造函数能把一个类型的对象(或引用)作为它的单个参数,那么这个构造函数允许编译器执行自动类型转换。
class One
{
public:
One(){}
};
class Two
{
public:
Two(One){}
};
void fun(Two)
{
}
int main()
{
One one;
fun(one);
}
从上面的代码我们可以看到通过构造函数可以 轻易的把一个类型的变量转换为另一个类型的变量,但有时这并不是我们想要的,可以通过在构造函数前加explicit关键字解决这种隐式转换。
class One
{
public:
One(){}
};
class Two
{
public:
explicit Two(One){}
};
void fun(Two)
{
}
int main()
{
One one;
// fun(one);<span style="white-space:pre"> </span>//编译将出错
fun(Two(one));
}
2、运算符转换
可以创建一个成员函数,这个函数通过在关键字operator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型。这种形式的运算符重载是独特的,因为没有指定一个返回类型--返回类型就是正在重载的运算符的名字。
class Four
{
};
class Three
{
public:
Three(){}
operator Four(){ return Four();}
};
void fun(Four)
{
}
int main()
{
Three three;
fun(three);
}