C++ primer plus 第16章string 类和标准模板库, 函数对象
C++ primer plus 第16章string 类和标准模板库, 函数对象
文章目录
16.5 函数对象
很多STL 算法都使用函数对象–也叫函数符(fiunctor)。函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象(即定义了函数 operator()()的类)。例如,可以像这样定义一个类:
class Linear
{
private :
double slope;
double y0;
public :
Linear(double sl=1,double y_=0)
:slope(sl),yo(y1){}
double operator()(double x)(return y0+slope *x}
};
这样,重载的()运算符将使得能够像函数那样使用Linear对象:
Linear f1;
Linear f2(2.5,10.0);//right-hand side is fl.operator()(12.5)
double y1 =f1(12.5);
double y2=f2(0.4);
其中y1将使用表达式0+112.5来计算,y2将使用表达式10.0+2.50.4来计算。在表达式 y0+slope*x中,y0 和 slope 的值来自对象的构造函数,而x的值来自 operator()( )的参数。还记得函数foreach吗?它将指定的函数用于区间中的每个成员:
for each(books.begin(),books.end(),ShowReview);
通常,第3个参数可以是常规函数,也可以是函数符。实际上,这提出了一个问题:如何声明第3个参数呢?不能把它声明为函数指针,因为函数指针指定了参数类型。由于容器可以包含任意类型,所以预先无法知道应使用哪种参数类型。STL通过使用模板解决了这个问题。forcach的原型看上去就像这样:
template<class InputIterator,class Function>Function for each(InputIterator first, InputIterator last, Function f);
ShowReview()的原型如下:
void ShowReview(const Review &);
这样,标识符 ShowReview的类型将为 void(*)(const Review &),这也是赋给模板参数 Function 的类型。对于不同的函数调用,Function 参数可以表示具有重载的()运算符的类类型。最终,forcach()代码将具有一个使用)的表达式。在 ShowReview()示例中,f是指向函数的指针,而代)调用该函数。如果最后的for each()参数是一个对象,则)将是调用其重载的()运算符的对象。
标签:slope,函数,16,对象,double,Linear,C++,模板,string From: https://blog.csdn.net/zhyjhacker/article/details/140711709