• C++ 自动转换和强制类型转换(用户自定义类类型)


    ——C++不自动转换不兼容的类型,允许用户自定义类类型的自动和强制转换

    其它类型转成类:

    只接受一个参数的构造函数可作为转换函数(若其它参数都有默认值,则也符合情况)

    class Stonewt
    {
    private:
        ...
    public:
        Stonewt (double lbs); {...}    // template ofr double_-to-Stonewt conversion
        ...
    }
    ------------------------------------------------------------------>main()
    
    Stonewt myCat;    // create a Stonewt object
    myCat = 19.6;    // 隐式自动转换 use Stonewt(double) to convert 19.6 to Stonewt
    myCat = Stonewt (19.6);  // 显示强制转换
    myCat = (Stonewt) 19.6;  // 显示强制转换
    
    • 程序使用构造函数Stonewt(double)来创建一个临时对象,并初始化;随后采用逐成员赋值方式将该临时对象的内容复制到myCat中
    • 关闭自动隐式转换:
      • C++新增关键字explicit
      • 用在声明头部
      • 不影响显示强制转换
    • 函数原型化提供的参数匹配过程,允许使用Stonewt (double) 构造函数来转换其它数值类型,例如允许传入int型数据,它将自动转换为double,条件是转换过程中不存在二义性
      • 如果类中还有Stonewt (long) 就存在二义性,double可转换为long

    转换函数:

    ——特殊的C++运算符函数,是用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。

    创建:

    operator typeName ();
    •  必须是类方法
    • 不能指定返回类型
    • 不能有参数

    例如,转换为double类型的函数的原型如下

    operator double ();
    
    • double即typeName指出要转换成的类型
    • 虽然没有声明返回类型,这个函数也将返回所需的值

    使用:

    cout<<"Poppins: "<<int (poppins)<<" pounds.
    ";  // popins is object

     cout语句使用显示强制类型转换

    cout<<"Poppins: "<<poppins<<" pounds.
    ";

    这里的cout应用自动类型转换

      • 类只定义了double转换函数时可用,若还有int转换函数,则编译器报错二义性
      • 当类定义了两种或更多的转换时,仍可以使用显示强制类型转换来指出要使用哪个转换函数

    原则上说,最好使用显示转换,而避免隐式转换(发生意想不到的错误:1.如将对象错当数组下标并不会报错 2.友元函数的参数是两个类引用,传入值中一个是标准类型,一个是类对象,则会发生是将标准类型转换为类【前一种构造转换函数】还是将类转换为标准类型【后一种转换函数】)。在C++98中,关键字explicit不能用于转换函数,但C++11消除了这种限制,使得只能显示转换,这样就规避了第二种错误,以及提醒程序员不要犯第一种错误。

    class Stonewt
    {
     ...
    // conversion functions
        explicit operator int() const;
        explicit operator double() const;
    };
    

      有了这些声明后,需要强制转换时将调用这些运算符

    将类对象赋给typeName变量或将其强制转换为typeName类型时,该转换函数将自动被调用

     

     

  • 相关阅读:
    Subsequence
    【模板】AC自动机(加强版)
    1563: hzwer的跳跳棋(hop)
    P2469 [SDOI2010]星际竞速
    P2746 [USACO5.3]校园网Network of Schools
    Blocks
    Training little cats
    Period
    UVA-3942 Remember the Word
    初学线段树(poj3264+poj2777)
  • 原文地址:https://www.cnblogs.com/suui90/p/13086516.html
Copyright © 2020-2023  润新知