函数调用运算符

struct absInt{
    int operator()(int val) const{
        return val < 0 ? -val:val;
    }
};

这个类定义了操作:函数调用运算符,它负责接受一个int类型的实参,然后返回该实参的绝对值。调用:

int i=-42;
absInt absObj;  //含有函数运算符的对象
int ui = absObj(i); //将i传递给absObj.operator()
class PrintString{
public:
    PrintString(ostream &o = cout, char c = ' '):
        os(o), sep(c) { }
    void operator()(const string &s) const { os << s << sep; }
private:
    ostream &os;   //用于写入的目的刘
    char sep;      //用于将不同输出隔开的字符
}

类型转换运算符

举个例子,我们定义一个简单的类,令其表示0到255之间的一个整数:
class SmallInt{
public:
    SmallInt(int i = 0); val(i)
    {
        if(i<0 || i>255)
            throw std::out_of_range("Bad SmallInt value");
    }
    operator int() const {return val;}
private:
    std::size_t val;
};

上面的类拥有两种转换能力,一是将int类型的值转换为类类型,这是通过构造函数完成的,二是将int类型转换为类类型。

SmallInt si;
si = 4;   //首先将4隐式的转换成SmallInt,然后调用SmallInt::operator=
si + 3;   //首先将si隐式转换成int,然后执行整数的加法

类类型定义的转换:类类型能定义由编译器自动执行转换,不过编译器每次只能执行一种类型的转换。

//内置类型转换将double实参转换为int
SmallInt si = 3.14;  
si + 3.14;

上面的转换中,先执行内置的数据类型转换,再执行类类型转化,一共执行了两次数据类型转换

猜你喜欢

转载自blog.csdn.net/xnnswmzdszyd/article/details/94430030