函数调用操作符(operator())



许多STL算法都需要用户指定某个条件或某个策略,而条件或策略的背后由一整组操作构成,便需要某种特殊的东西来代表这“一整组操作”。

代表“一整组操作”的,当然是函数。过去C语言时代,欲将函数当做参数传递,唯有通过函数指针才能达成。但是函数指针有缺点,最重要的是它无法持有自己的状态(所谓局部状态),也无法达到组件技术中的可适配性(adaptablity)-----也就是无法再将某些修饰条件加诸于其上而改变其状态。为此,STL算法的特殊版本所接受的所谓“条件”或“策略”或“一整组操作”,都以仿函数(函数对象)形式呈现。所谓仿函数就是使用起来像函数一样的东西。如果你针对某个class进行operator()重载,它就成为一个仿函数。例如:

#include <vector>

#include <algorithm>

#include <iostream>

using namespace std;

template <typename T>

class print

{

public:

voidoperator()(const T& elem)

{

cout<< elem << ‘ ‘;

}

};

int main(int argc, char* argv[])

{

intia[6] = {0,1,2,3,4,5};

vector<int>iv(ia,ia+6);

for_each(iv.begin(),iv.end(),print<int>());

}

由于operator()重载了,因此print成了一个仿函数。

函数调用操作符(operator())

时间: 2024-11-05 12:19:16

函数调用操作符(operator())的相关文章

5.7 C++函数调用操作符重载

参考:http://www.weixueyuan.net/view/6385.html 总结: 需要以类成员函数的形式对函数调用操作符"()"进行重载. 只有常成员函数才能处理常对象,故我们依然在类中提供两个版本的函数调用操作符重载函数.若调用对象为常对象(const),则必须用常函数. 这里面的关于在函数中抛出异常,在调用处捕捉异常,值得参考学习. 与下标操作符重载函数相同,我们同样需要以类成员函数的形式对函数调用操作符"()"进行重载.其声明语法只有一种形式: 

重载操作符 &#39;operator&#39;

operator 是 C++ 的(运算符的)重载操作符.用作扩展运算符的功能. 它和运算符一起使用,表示一个运算符函数,理解时应将  [operator+运算符] 整体上视为一个函数名. 要注意的是:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,"功能"都是由函数实现的). 使用时: [返回类型] [operator+运算符] (const ElemType&a)const  {...} 为什么需要重载操作符? 系统的所有操作符,一般情

C++重载操作符operator

operator是C++关键字,用于对C++进行扩展: 1.可以被重载的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,>,+=,<<,>>,<<=,>>=,++,!=,<=,>=,&&,||,++,--,->*,->,(),[] 不可以被重载的操作符:.  .* :: ?: 2.基类对赋值操作符(=)重载不能被派生类继承. “+”操作符重

【C++ Primer】重载操作符与转换

十四.重载操作符与转换 1. 重载操作符的定义 重载操作符必须具有至少一个类类型或枚举类型的操作数,这条规则强制重载操作符不能重新定义用于内置类型对象的操作符含义. int operator +(int, int) // 错误,内置数据类型不能重载操作符 重载操作符,操作符的优先级.结合性或操作数数目不能改变.重载操作符并不保证操作数的求值顺序,不再具备短路求值特性,因此,重载&&.||.逗号操作符不是一种好的做法.除了函数调用操作符 operator()外,重载操作符时使用默认实参是非法

C++ Primer 学习笔记_58_重载操作符与转换 --重载操作符的定义

重载操作符与转换 --重载操作符的定义 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 重载操作符的定义 重载操作符是具有特殊名称的函数:保留字operator后接定义的操作符符号.如: Sales_item operator+(const Sales_item &,const Sales_item &); 除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同.函数调用操作符可以接受任意数目的操作数. 1.重载的操作符名

泛型和面向对象C++

1. 在类内部定义的函数默认为inline,内联函数应该在头文件中定义,因为其定义对编译器必须是可见的,以便编译器能够在调用点内联展开该函数的代码.此时,仅有函数原型是不够的. 2.assert 3.异常 4.由于流对象不能复制,因此不能存储在容器中:由于流不能复制,因此形参或返回类型也不能为流类型,必须用指针或引用,对IO对象的读写会改变它的状态,因此引用必须是非const的. 5.如果需要重用文件流读写多个文件,必须在读另一个文件之前调用clear清除该流的状态. 6.前向声明.在声明之后,

STL--向量(vector)

STL的组成 标准模板库STL关注的重点是泛型数据结构和算法,其关键组成部分是容器(containers).算法(algorithms).迭代器(iterators).函数对象(Function Object).适配(Adaptor). 本文地址:http://www.cnblogs.com/archimedes/p/Cpp-STL-Vector.html,转载请注明源地址. 容器(containers):容器是数据在内存中组织的方法,例如,数组.堆栈.队列.链表或二叉树(不过这些都不是STL标

C++中容易忽略的知识

变量 内置类型 在C++中,类型的定义基本和C语言的相同,只是有一些不同.在C++中,根据C++ Primer中所讲,main()函数的返回类型必须是int型.这个没有亲自验证过,或者说曾经遇到但是没有注意.估计使用不同的编译器结果是不一样的吧,有些编译器会对C++的标准进行扩展.而且空格符不允许出现在预处理指示中. 在内置类型中遇到的第一个问题是bool类型到底占了多大的存储空间.这个是C++标准未定义的,编译器可以根据自己的想法规定bool类型所占据的存储空间. C++中有一种类型叫wcha

C++面试小结

虚函数与纯虚函数: 引入虚函数是为了动态绑定,引入纯虚函数是为了派生接口 基类需要虚的析构函数的原因: 当derived class由一个base class指针被删除而该base class指针为non-virtual的时候,可能会发生内存泄漏,使用虚的析构函数可以解决该问题 ++i与i++的区别: //i++ 实现代码为: int operator++(int) { int temp = *this; ++*this; return temp; }// 返回一个 int 型的对象本身 //