一、类型转换运算符
转化成其他类类型
// 格式 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