重载运算与类型转换

可调用对象与function

  c++中有几种可调用对象:函数、函数指针、lambda表达式以及重载了函数调用运算符的类。和其他对象一样,可调用的对象也有类型。然而,两个不同类型的可调用对象可能共享同一种调用类型。例如 int(int,int)是一个函数类型,其接受两个int,return 一个int。

  对于几个可调用对象共享同一种调用形式的情况,我们会希望把它们看成具有相同的类型。例如,考虑以下几个不同类型的可调用对象:

// 普通函数
int add(int i, int j) { return i + j; }

// lambda, 产生一个未命名的函数对象类
auto mod = [](int i, int j) { return i % j;};

// 函数对象类
struct divide {
     int operator() (int deno, int divi) {
           return deno / divi;
    }
}   

  上述对象共享int(int, int)类的调用形式。我们希望有一个函数表,这个函数表为一个map, key为表示运算符的string, value为对应的函数指针,如下所示:

map<string, int(*)(int, int)> binops;

型转换运算符

  类型转换运算符是一类特殊的成员函数,其形式如下所示:

// 类型转换函数
operator type() const;

// e.g 转换为int
operator int() const;

  为了防止隐式的类型转换,c++11引入了显式的类型转换运算符,如下:

explicit operator int() const {return val;}
SmallInt si = 3; // right
si + 3; //wrong need隐式的转换
static_cast<int>(si) + 3; // right 显示地请求类型转换

  有一个例外情况,在这个情况下显式的类型转换会隐示的使用。这个情况为 表达式用作条件时。

原文地址:https://www.cnblogs.com/z1141000271/p/15009435.html