C++随笔-转换函数

默认使用类对象的构造函数作为转换函数

当需要将其它类型转换为用户自定义类时,如果用户自定义类中存在只接受一个参数,且该参数为待转换类型的构造函数,则可以在某些情况下隐式调用构造函数作为转换函数,从而实现类型的转换。当构造函数有多个参数时,只有一个参数没有默认值,而其他参数都配置了默认值,则同样可以被自动隐式地作为转换函数。同时,如果担心隐式转换会带来意想不到的错误,可以使用关键字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避免隐式转换,只能进行显式转换。

注意

转换函数虽然在声明时不返回参数和不传入参数,但是在函数定义下必须返回转换后的值。

 

总结

使用构造函数充当转换函数只适用于某种类型到类类型的转换,同时需要类构造函数只唯一接受一个参数,参数类型为待转换类型。而若要实现将类类型转换为其它类型,则需要在定义一个转换函数,并将其作为类成员函数。

无论采用哪种方式实现类型转换,都需要注意避免二义性的出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值