首页 > 其他 > 详细

类型转换运算符

时间:2020-06-16 22:05:46      阅读:59      评论:0      收藏:0      [点我收藏+]

一、类型转换运算符

转化成其他类类型

// 格式
operate type() const
{
    // 通过类返回指定的type类型的值
}
// 类型转换运算符必须要写成类的成员函数
// 例子
class Element{
explicit  operate int() const;  // explicit 禁止隐式类型转换
}
Element ele;
int k = ele + 5;    //  隐式调用
int k2 = ele.operate int() + 5;  //  显式调用
int k3 = static_cast<int>(ele) + 5;  // 当隐式类型转换被禁止的时,只能用强制类型转换

类型转换运算符转换成函数指针

class Element
    {
    public:
        // 函数指针类型
        // 用下面的两种方法都可以定义一个函数指针
        // typedef void(*funname)(int);  
        using funname = void(*)(int);
    public:
        static void GetElemnetId(int val)
        {
        }       
        // 函数类型转换符,能将本类转换成一个函数指针类型
        // 这样写了之后,Element(1),可以将类看成是一个函数名
        // 会调用funname()中返回的函数
        operator funname()  // const 不是必须的
        {
            // 因为这里已经制定了返回值类型为函数指针类型,所以需要返回一个函数名
            return GetElemnetId;
        }
    };

    Element ele;
    ele(1);    // 隐式调用,将类的对象直接当成了一个函数
    ele.operator Element::funname()(12);  // 显示的调用

二、类型转换的二义性问题

当一个类中有多个类型转换函数时,隐式调用会出现二义性问题,这时在调用类型转换运算符时候,一定要显示调用。

小结:

对于二义性问题,最简单的解决方式是全部显示地指定所调用的函数和转换的类型。

二、类的成员函数指针

class Element
{
public:
    void ptFun(int val) {};
    virtual void virtualFun(int val) {};
    static void staticFun(int val) {};
};

int main()
{
    void (Element::*funname)(int);   // 一个类成员函数指针变量的定义
    funname = &Element::ptFun;       // 类成员函数指针变量funname被赋值
    // 成员函数是属于类的,不属于对象,只要有类在就有成员函数的地址
    // 但是如果要使用这个成员函数指针,就必须要把它绑定到一个类对象
    // 调用方式
    Element ele, *pEle;
    (ele.*funname)(2);    // 前面一定要加括号,因为后面的圆括号优先级更高
    (pEle->*funname)(2);  // 对象指针的调用


    cout << 1 << endl;
    system("pause");
    return 0;
}

 

类型转换运算符

原文:https://www.cnblogs.com/zhiminzeng/p/13144398.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!