默认使用类对象的构造函数作为转换函数
当需要将其它类型转换为用户自定义类时,如果用户自定义类中存在只接受一个参数,且该参数为待转换类型的构造函数,则可以在某些情况下隐式调用构造函数作为转换函数,从而实现类型的转换。当构造函数有多个参数时,只有一个参数没有默认值,而其他参数都配置了默认值,则同样可以被自动隐式地作为转换函数。同时,如果担心隐式转换会带来意想不到的错误,可以使用关键字explicit声明构造函数的显式调用有效性,即只允许被显式地调用,不允许被隐式地调用。
- 隐式调用:例如在赋值语句中。
- 显式调用:例如直接调用构造函数,向构造函数传递其它类型的数据。
class Classname{
private:
Classname(const double);
~Classname();
...
public:
double member1;
...
}
//implicit
Classname instance;
instance = 10.1;
//explicit
instance = Classname(10.1);
//or
instance = (Classname)10.1;
转换函数
用户定义的强制类型转换函数。
声明语句:
operator typename();
注意,转换函数只能作为类成员函数,该函数是作为类成员函数被调用的。且不允许有返回值和传入参数。其中typename是类对象待转换成的类型。该函数同样可以被隐式调用,例如将类对象赋予typename类型时,将自动隐式地调用转换函数。
显式调用语法有两种:
typename(classinstance);
//or
(typename)classinstance;
该转换函数是用于将相应类对象转换为其它类型的。
同样可以使用关键字explicit避免隐式转换,只能进行显式转换。
注意
转换函数虽然在声明时不返回参数和不传入参数,但是在函数定义下必须返回转换后的值。
总结
使用构造函数充当转换函数只适用于某种类型到类类型的转换,同时需要类构造函数只唯一接受一个参数,参数类型为待转换类型。而若要实现将类类型转换为其它类型,则需要在定义一个转换函数,并将其作为类成员函数。
无论采用哪种方式实现类型转换,都需要注意避免二义性的出现。