c/c++ 重载运算符 函数调用运算符

重载运算符 函数调用运算符

把一个类的对象a,当成函数来使用,比如a(),所以需要重载operator()方法。重载了函数调用运算符的类的对象,就是函数对象了。

还有什么是函数对象呢???

  • lambda是函数对象
  • std::bind函数的返回值是函数对象
  • 函数是函数对象
  • 函数指针是函数对象

那函数对象是做什么用的呢???

  • 在标准算法中使用,比如std::(b, e, 函数对象);

标准库提供了下面的函数对象,它们都是模板形式的,它们放在functional头文件中

算术 关系 逻辑
plus<Type> equal_to<Type> logical_and<Type>
minus<Type> not_equal_to<Type> logical_or<Type>
multiplies<Type> greater<Type> logical_not<Type>
divides<Type> greater_equal<Type>
modulus<Type> less<Type>
negate<Type> less_equal<Type>

例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <functional>

class LineStr{
public:
  LineStr(std::istream& in = std::cin) : is(in){}
  std::string operator()(){
    std::string str;
    std::getline(is, str);
    return is ? str : std::string();
  }
private:
  std::istream& is;
};

class Isequ{
public:
  Isequ(int i = 0) : val(i){}
  bool operator()(int t){
    return val == t;
  }
private:
  int val;
};

class StableSort{
public:
  bool operator()(const std::string& a, const std::string& b){
    return a.size() < b.size();
  }
};

class SizeCmp{
public:
  SizeCmp(std::size_t s) : sz(s){}
  bool operator()(const std::string& str)const{
    return str.size() > sz;
  }
private:
  std::size_t sz;
};

int main(){
  /*
  LineStr ls;
  std::cout << ls() << std::endl;
  */
  /*
  std::vector<int> vi{23,3,5,6,78,3};
  Isequ iq(3);
  std::replace_if(vi.begin(), vi.end(), iq, 9);
  for(int i : vi)
    std::cout << i << " ";
  std::cout << std::endl;
  */
  /*
  std::vector<std::string> vs{"1234", "123", "a", "bc"};
  //stable_sort(vs.begin(), vs.end(), [](const std::string& a,
  //                   const std::string& b){
  //        return a.size() < b.size();
  //          });
  //std::stable_sort(vs.begin(), vs.end(), StableSort());
  StableSort ss;
  std::stable_sort(vs.begin(), vs.end(), ss);
  std::size_t sz = 2;
  //auto b = std::find_if(vs.cbegin(), vs.cend(), [sz](const std::string& a){
  //    return a.size() > sz;
  //  });
  SizeCmp sc(3);
  auto b = std::find_if(vs.cbegin(), vs.cend(), sc);
  for_each(b, vs.cend(), [](const std::string& s){
      std::cout << s << " ";
    });
  std::cout << std::endl;
  for(auto s : vs)
    std::cout << s << " ";
  std::cout << std::endl;
  */
  using std::placeholders::_1;
  std::vector<int> iv {12,213,123123,434344,213232};
  int cnt = std::count_if(iv.cbegin(), iv.cend(),
              std::bind(std::greater<int>(), _1, 1024));
  std::cout << cnt << std::endl;

  std::vector<std::string> sv{"pooh", "pooh", "11","pooh","22"};
  auto idx = std::find_if(sv.cbegin(), sv.cend(),
              std::bind(std::not_equal_to<std::string>(),_1, "pooh"));
  std::cout << *idx << std::endl;

  std::vector<int> iv2 {12,3,12,4,21};
  std::transform(iv2.cbegin(), iv2.cend(), iv2.begin(),
         std::bind(std::multiplies<int>(), _1, 2));
  for(auto i : iv2)
    std::cout << i << " ";
  std::cout << std::endl;

}

github

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/10176824.html

时间: 2024-11-10 15:05:49

c/c++ 重载运算符 函数调用运算符的相关文章

函数调用运算符重载

如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象.因为这样的类同时也能存储状态,所以与普通函数相比它们更加灵活. 例如: struct absInt{ int operator()(int val) const{ return val<0?-val:val; } } 这个类只定义了一种操作:函数调用运算符,它负责介接受一个int类型的实参,然后返回该实参的绝对值. 我们使用调用运算符的方式是令一个absInt对象作用于一个实参列表,这一过程看起来非常像调用函数的过程: int

C++中不可重载5个运算符

C++中不可重载的5个运算符 C++中的大部分运算符都是可以重载的,只有以下5个运算符不可以重载,他们是: 1  .(点运算符)通常用于去对象的成员,但是->(箭头运算符),是可以重载的 2  ::(域运算符)即类名+域运算符,取成员,不可以重载 3  .*(点星运算符,)不可以重载,成员指针运算符".*,即成员是指针类型 4  ?:(条件运算符)不可以重载 5  sizeof不可以重载

网易云课堂_C++程序设计入门(下)_第8单元:年年岁岁花相似– 运算符重载_第8单元 - 作业2:OJ编程 - 重载数组下标运算符

第8单元 - 作业2:OJ编程 - 重载数组下标运算符 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 练习数组下标运算符重载 依照学术诚信条款,我保证此作业是本人独立完成的. 1 练习数组下标运算符重载(6分) 本题目具体内容请参见 [第8单元 - 单元作业2说明] 时间限制:500ms内存限制:32000kb #include <iostream> #in

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、&gt;&gt;和&lt;&lt;运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

C++运算符重载——输入/输出运算符

为了与IO标准库一致,重载输入输出运算符函数的第一个行参应该是流的引用,第二个行参是对象的引用. 如果重载为类的成员函数,第一个行参应该是对象的引用,第二个行参是流的引用. 使用方式是 ClassObj << cout 这样与标准IO库就不一致了,所以输入输出运算符不能重载为类的成员函数,可以重载为类的友元函数和普通函数. 通常重载输出运算符的第二个行参是const的,因为输出一个类不许要更改它: 但是重载输入运算符的第二个行参必须是非const的,否则无法赋值. 重载的基本方法如下: //重

C++重载流插入运算符和流提取运算符

C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream.cin和cout分别是istream类和ostream类的对象.在类库提供的头文件中已经对“<<”和“>>”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据.因此,凡是用“cout<<”和“cin>>”对标准类型数据进行输入输出的,都要用#incl

C++重载自增运算符的效率问题

C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数. increment的前缀形式表示“增加然后取回”,后缀形式表示“取回然后增加”. 1 #include "stdafx.h" 2 #include "assert.h" 3 class A 4 { 5 public: 6 A(int i) 7 :m_i(i) 8 { 9 } 10 // ++i 11 A& operator++() 12 { 13 ++m_i

people为基类,student和graduate为子类,重载“==”运算符

//people为基类,student和graduate为子类,重载“==”运算符 //输入2个学生的信息:姓名.编号.身份证号.班级.专业 //输入1个研究生的信息:姓名.编号.身份证号.班级.专业.导师 //重载“==”,当两个学生的编号相同时,调用重载运算符,输出错误信息 源代码如下: #include <iostream>#include <string>using namespace std;//定义基类class People { public: //成员变量:姓名,编