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;
上面的转换中,先执行内置的数据类型转换,再执行类类型转化,一共执行了两次数据类型转换