记住这个,能少走弯路,C++两种隐式类型转换 博客
  • 滴水逆向 等级 V0
    2020-10-04 09:52

    采用C++进行程序开发的过程中,难免会遇到各种各样莫名其妙的问题,而有些问题只有了解了其用法和原理之后,才能避免在工作中犯错误。

    本文将要讲解的C++两种隐式类型转换,如果不了解其用法,那么遇到问题的时候,可能就会陷入困境。

    所以接下来就来讲解operator与构造函数的隐式类型转换,首先通过例子说明operator的隐式类型转换,再说明构造函数的隐式类型转换,最后再总结它们之间的区别。

    记住这个,能少走弯路,C++两种隐式类型转换

    一、 operator隐式类型转换

    operator除了操作符的重载之外,还有隐式类型转换的功能。operator隐式类型转换是指隐式将当前对象生成其他类型的对象。

    为了说明operator的隐式类型转换,首先实现ObjectA对象, 形如operator int的声明即为operator的隐式类型,而转换的类型为整型int。

    记住这个,能少走弯路,C++两种隐式类型转换

    1、主程序输入如下代码段,先创建ObjectA类型的对象objA,然后将该对象变量objA与整型数字4相加。

    记住这个,能少走弯路,C++两种隐式类型转换

    2、从 调试运行输出的结果看,ObjA虽然不是int类型,但是与整数类型4进行相加的时候,会调用到operator int函数,该函数返回的结果是int类型

    记住这个,能少走弯路,C++两种隐式类型转换

    二、构造函数的隐式类型转换

    构造函数的隐式类型转换,是用其他类型来构造当前类型的临时对象。

    为了说明构造函数的隐式类型转换,需要实现ObjectB类,该类实现了一个无参数构造函数、一个参数类型为ObjectA的构造函数,一个析构函数和打印函数,注意入参类型是ObjectB。

    记住这个,能少走弯路,C++两种隐式类型转换

    1、主程序中输入如下代码段, 创建ObjectA类型的对象objA,主要用于说明后面构造函数隐式类型的转换,接着创建ObjectB类型的对象objB,最后调用该对象的打印函数print,但是入参类型为ObjectA。

    记住这个,能少走弯路,C++两种隐式类型转换

    2、 从调试运行输出结果看,print函数声明的入参类型是ObjectB, 但是传递的类型是ObjectA,但是由于ObjectB有单一形参类型为ObjectA的构造函数,程序会隐式的将objA转换为ObjectB(objA)

    记住这个,能少走弯路,C++两种隐式类型转换

    3、 如果想禁用构造函数的隐式类型转换,那么构造函数前添加explicit 即可,例如:

    记住这个,能少走弯路,C++两种隐式类型转换

    三、总结

    本文主要通过例子讲解了opertor隐式类型与构造函数隐式类型的用法,C++提供了这样的机制,必然有其合理性,正所谓存在即合理,但是,开发过程中,如果不注意的话,也会带来很多不必要的麻烦,因此,对其有一个整体的概念的理解,能够在开发过程中,给予一个警惕的作用。最后再来梳理下两种隐式类型转换的区别。

    1. operator的隐式类型转换是将当前对象生成其他类型的对象。
    2. 构造函数的隐式类型转换,是用其他类型来构造当前类型的临时对象
    3. operator的隐式类型转换与构造函数的隐式类型转换是相反的。


  • 浏览 52
  • 点赞 0
  • 收藏 1
  • 分享 0
  • 查看云盘地址请登录
  • 点赞 已赞 收藏 已收藏
评论
    页 到
    talk top
    展开
    >