首页 > 编程语言 >C++ primer plus 第16章string 类和标准模板库, 函数对象

C++ primer plus 第16章string 类和标准模板库, 函数对象

时间:2024-07-26 11:57:38浏览次数:17  
标签:slope 函数 16 对象 double Linear C++ 模板 string

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

相关文章

  • 当你第一次用C++string的assign会遇到这种情况
    当你第一次用string的assign时,会发现有一点小区别,见以下代码:stringstr1;str1.assign("helloC++");cout<<str1<<endl;stringstr2;str2.assign(str1,5);cout<<str1<<endl;stringstr3;str3.assign("helloC++",5);cout<<......
  • 使用pybind11封装c++的dll,供python调用
    用pip安装好pybind11 文件清单,都写在一个目录里//文件名:add.cppextern"C"doubleadd(doublein1,doublein2){returnin1+in2;}//文件名:sub.cppextern"C"doublesub(doublein1,doublein2){returnin1-in2;}//文件名:mul.cppextern"......
  • P9304 「DTOI-5」3-1题解,c++树的遍历例题
    题意给定以n(1≤n≤1......
  • C/C++默认生成的几个函数s
    一、关键词类/结构体默认生成。拷贝/移动+构造/赋值=组合不同方式有4种,除默认、析构,共计6种。在使用时:拷贝/移动+赋值的,都是定义和赋值分开;拷贝/移动+构造的,都是定义和赋值一起。二:知识点默认构造函数Student():age(0){};拷贝构造函数Student(constStudent&i......
  • C++ typeid 关键字的注意事项
    typeid 是C++的一个关键字,用于动态类型获取。typeid 运算符与RTTI(运行时类型信息)密切相关,它返回一个指向 std::type_info 对象的引用,该对象表示了表达式的类型。使用 typeid 时,需要注意以下几个方面:需要#include <typeinfo>头文件:要使用 typeid,应在代码中包含 <t......
  • C++ 虚基类注意事项
    C++中的虚基类(VirtualBaseClass)是一个重要的概念,主要用于解决多重继承中的菱形继承问题,即当一个派生类通过多条路径继承同一个基类时,基类在派生类中会有多个副本,导致资源浪费和不必要的复杂性。以下是C++虚基类的一些详细注意事项:1.虚基类的定义与声明定义方式:虚基类并不......
  • PYTHON 代码执行错误 - 冻结 importlib._bootstrap>(1165)_find_and_load()?
    在MACOS10.15(CATALINA)上执行此PYTHON代码时出现以下错误。我正在使用IDLEShell编写PYTHON3.11。Python3.11.4(v3.11.4:d2340ef257,Jun 62023,19:15:51)[Clang13.0.0(clang-1300.0.29.30)]ondarwinType"help","copyright","credits"o......
  • C++中的智能指针与裸指针有什么区别?
    在C++中,智能指针是一种特殊类型的指针对象,它能自动管理内存的分配和释放。智能指针与裸指针(即传统的指针)之间有以下区别:自动资源管理:智能指针通过使用引用计数或其他机制来自动管理内存资源的分配和释放。这意味着当不再需要指针指向的对象时,智能指针会自动释放内存,避免......
  • C++中的虚函数与多态机制如何工作?
    在C++中,虚函数和多态机制是实现面向对象编程的重要概念。虚函数是在基类中声明的函数,可以在派生类中进行重写。当基类的指针或引用指向派生类的对象时,通过调用虚函数可以实现动态绑定,即在运行时确定要调用的函数。多态是指通过基类的指针或引用调用虚函数时,会根据对象的实......
  • C++文件系统操作5 - 跨平台列出指定目录下的所有文件和文件夹
    1.关键词2.fileutil.h3.fileutil.cpp4.filesystem_win.h5.filesystem_win.cpp6.filesystem_unix.cpp7.源码地址1.关键词C++文件系统操作列出指定目录下的所有文件列出指定目录下的所有文件夹跨平台2.fileutil.h#pragmaonce#include<string>#includ......