C++函数对象,伪函数

1、函数对象——重载了()操作符的类

class SumAdd
{
public:
	void operator() ()  //这里两个括号看起来很怪,第一个是表示重载()操作符,第二个表示使用时()中写几个参数和参数的类型,这里没有写参数
	{
		
	}
};

2 、一元函数对象和二元函数对象

一元函数对象表示一个参数的函数对象(在类中重载()操作符时规定了一个参数),同理,二元函数对象就是两个参数的函数对象

//一元函数对象
class SumAdd
{
public:
	void operator() (int a) 
	{
		...
	}
};

//二元函数对象
class SumAdd
{
public:
	void operator() (int a,int  b) 
	{
		...
	}
};

那么有没有三元函数对象呢,按照这个规定,只要重载函数操作符时规定三个参数即可

3、函数对象的使用方法

当了解到函数对象怎么用市其实也很简单,定义一个重载了()的类的对象,然后直接使用()就行,就像用其他操作符一样(比如+ -等等)
具体例子

class myadd
{
public:
	int operator() (int &add1 , int &add2 ,int &add3)
	{
		return add1 + add2 + add3;
	}
};
int main(void)
{
	myadd myadd;    //用类定义一个对象
	int a = 6;
	int b = 8;
	int c = 8;
	int temp = myadd(a, b ,c);  //直接用()即可
	cout << "add:"<<temp << endl;
	cout << endl;
	system("pause")
}

4、伪函数

由上面例子可见,在重载了()操作符的对象使用()是,很像是在调用一个函数,所以函数对象也叫做伪函数,自己理解这个伪没有什么特殊的含义,就是指调用的样子和调用函数很像而已

5 、涉及函数对象的几个STL 算法

1、for_each()

class mycount
{
public:
	void operator()(int &count1)
	{
		n++;
		cout <<"void operator()(int &count1) n:"<< n << endl;
	}
	void printf_count()
	{
		cout << n << endl;
	}
public:
	int n;
};

int main(void)
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	mycount mycount;
	for_each(v1.begin(), v1.end(), mycount); //匿名函数对象 匿名仿函数
	cout << "mycount.n:"<<mycount.n << endl;//输出0
	cout << "printf_count:";
	mycount.printf_count();//输出0

	mycount = for_each(v1.begin(), v1.end(), mycount); //匿名函数对象 匿名仿函数
	cout << "2mycount.n:" << mycount.n << endl;//输出3
	cout << "2printf_count:";
	mycount.printf_count();//输出3

	//for_each算法的 函数对象的传递 是元素值传递 ,不是引用传递
	/*
		template<class _InIt,
		class _Fn1> inline
			_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
		{	// perform function for each element
			_DEBUG_RANGE(_First, _Last);
			_DEBUG_POINTER(_Func);
			return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
		}
	*/
	//分清楚 stl算法返回的值是迭代器 还是 谓词(函数对象)
	cout << endl;
	system("pause");

因为for_each()中函数对象的传递是值传递而不是引用传递,所以在传递的时候会为形参创建副本,所以改变的知识副本而已,要是想改变实参,就要知道函数返回的是什么,像for_each()返回的是一个对象,所以我们只要用原对象去接就行了
2、find_if()

class IsDiv
{
public:
	IsDiv(const int  &divisor)
	{
		this->divisor = divisor;
	}
	bool operator()(int  &t)
	{
		return (t%divisor == 0);
	}
private:
	int divisor;
};
int main(void)
{
	vector<int> v2;
	for (int i = 10; i<33; i++)
	{
		v2.push_back(i);
	}
	int a = 4;
	IsDiv myDiv(a);
	vector<int>::iterator it;
	it = find_if(v2.begin(), v2.end(), IsDiv(a));
	if (it == v2.end())
	{
		cout << "容器中没有被4整除的元素" << endl;
	}
	else
	{
		cout << "第一个是被4整除的元素是:" << *it << endl;
	}
}

find_if()函数返回的则是一个迭代器,所以才说;
!!!分清楚 stl算法返回的值是迭代器 还是 谓词(函数对象)

发布了46 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42718004/article/details/85807207
今日推荐