1 调用运算符
当用点运算符访问一个成员函数时,我们是想调用该函数。我们使用调用运算符( () )来调用一个函数。调用运算符是一对圆括号,里面放置实参列表(可能为空)。
2 可调用对象
对于一个对象或一个表达式,如果可以对其使用调用运算符,则称它为可调用对象(表达式)。可调用对象包含函数、函数指针、重载了函数调用符的类以及Lambda表达式四种。
2.1 函数
// 计算val的阶乘
int fact(int val)
{
int ret = 1;
while(val > 1)
ret *= val--;
return ret;
}
2.2 函数指针
// 函数:比较两个string对象的长度
bool lengthCompare(const string &, const string &);
// pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型
bool (*pf) (const string &, const string &); // 未初始化
// 赋值
pf = lengthCompare;
2.3 重载了函数调用运算符的类
// struct含有一个调用运算符,该运算符负责返回其参数的绝对值
struct absInt()
{
int operator() (int val) const
{
return val < 0 ? -val : val;
}
}
2.4 Lambda表达式
[] (const string &a, const string &b)
{ return a.size() < b.size(); }
3 谓词
谓词是一个可调用的表达式,除此之外,其返回结果必须是一个能用作判断条件的值。标准库算法所使用的谓词分为两类:一元谓词(只接受单一参数)和二元谓词(有两个参数)。例如,我们常常使用sort算法对vector进行排序。而sort是重载过的,第二个版本接受第三个参数,该参数就是一个二元谓词。
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
// 谓词是一个返回值为bool的函数
sort(words.begin(), word.end(), isShorter);
// 谓词是一个返回值为bool的Lambda表达式
sort(words.begin(), word.end(), [] (const string &s1, const string &s2) -> bool { return s1.size() < s2.size();} );