转自:C++中如何区分构造函数与重载operator()得到的仿函数?求大神!_360问答

此外,你觉得仿函数(functor)是否能完全取代function呢?

以下是个人使用C++仿函数,function表达式的一些体悟。

首先是定义形式:

构造函数无返回值,而operator是可以有返回值的;

定义时,构造函数需要类名,而重载operator()则不用;

其次是调用形式:

构造函数是声明对象,而仿函数则需要声明好的对象进行调用。

functor是仿函数,function是函数还是std::function?

如果是函数的话,个人感觉不会替代。因为毕竟C++是C的超集,而C中很多用到函数指针的地方,functor可能并不那么好用。

如果是std::function的话,那感觉也不会替代,因为std::function配合std::bind可以处理函数及仿函数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。而functor好像不能以std::function作为参数传入。

话说仿函数即函数对象书写比较费事,所以C++ 11增加了lambda表达式,即匿名函数。函数对象即仿函数多用于C++ STL中,而在微软新加入的并行库PPL中,task等并不接受仿函数,多用lambda表达式。更容易。

希望不会误人子弟。

追问 : 谢谢!您的分析给了我很大启发,确实两者之间还是有着很大差距的。还有一个小问题想请教一下,我现在准备实现一个小的动态语言解释器。如果将里面的函数用伪函数的思想来实现的话就能很方便地将函数和对象统一起来。我想问问我这想法可以实施吗?

追答 : 可以。仿函数本来就是一个对象,但是它可以像函数一样调用,所以叫仿函数。另外仿函数是可以带状态的(即可以带一些附加数据)。而函数指针式是不可以的。

【转】C++中如何区分构造函数与重载operator()得到的仿函数?相关推荐

  1. 继承关系中的拷贝构造函数和赋值操作重载函数分析

    文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...

  2. C++中复制构造函数与重载赋值操作符

    我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类:     class C ...

  3. C++ 拷贝构造函数和重载赋值运算符的区别

    文章目录 拷贝构造函数 重载赋值运算符 赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成,而拷贝构造函数会生成新的对象. 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别,将详细通 ...

  4. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

    文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...

  5. [转载] JAVA 构造函数及其重载

    参考链接: Java重载Overload public class Student{ public int stuId; public String stuName; public int stuAg ...

  6. C++:构造函数的重载

    在一个类中可以定义多个构造函数,以便为对象提供不同的初始化的方法,供用户选用,这些构造函数具有相同的名字,而参数的个数或参数的类型不相同,这称为构造函数的重载. #include<iostrea ...

  7. C++中若类中没有默认构造函数,如何使用对象数组

    前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: 1 #include <memory> 2 #include <iostrea ...

  8. 一个程序让你学会C++构造函数与重载构造、析构函数【C++类的经典使用案例】

    文章目录 一.构造函数的用法 二.构造函数的重载 三.析构函数 一.构造函数的用法 #include <iostream> using namespace std;//声明Time类 cl ...

  9. java 方法的重载_Java中的方法和方法重载

    今天我们来说说Java中的方法和方法重载以及需要注意的一些地方; 方法: Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段, 声明格式: [修饰符1  修饰符2 ....]  ,返 ...

最新文章

  1. 求介绍matlab函数用法的书,MATLAB初学者教程--函数用法的简单介绍
  2. 10 个 Linux 中方便的 Bash 别名
  3. php mail 失败,php-mail()失败,但返回true
  4. 不是你无法入门自然语言处理(NLP),而是你没找到正确的打开
  5. C指针原理(26)-gtk
  6. 大写牛逼,用 Python 登录主流 24 个网站
  7. # 20175213 2018-2019-2 《Java程序设计》第1周学习总结
  8. Git忽略规则.gitignore梳理
  9. 靖江机器人怎么样_铁饭碗不保?靖江可能消失的12大职业!快看有你的工作没?...
  10. Linq中string转int的方法
  11. php 编写mysql_php编写数据写入mysql问题
  12. vue 实现文件下载
  13. CHIL-SQL-LEFT JOIN 关键字
  14. 基于kali linux 跑字典暴力破解wifi教程
  15. YUV422转RGB并显示于Qlabel
  16. 几大技术体系极其应用
  17. 二、Vue实例对象及其属性
  18. 基于python的在线音乐系统设计与实现
  19. Composing builds 依赖统一管理实践
  20. 从P6 到P7,到底要做哪些准备,掌握多少知(姿)识(势),小鱼亲身分享!!

热门文章

  1. java stringutils_Java 笔记----- StringUtils 拼接字符
  2. springboot创建子模块时遇到子模块覆盖父模块问题解决
  3. Python爬虫爬取美剧网站
  4. 网络数据库的复制和同步(转摘)
  5. 数据结构四——散列表(下)
  6. python对象属性在引用时前面需要加()_python基础-面向对象进阶
  7. 计算机四级考试题数据库,计算机四级考试《数据库系统工程师》试题及答案
  8. c++定义一个动态全局变量_静态链接与动态链接的宏观概述及微观详解
  9. java商城_java开源商城系统的优势是什么?
  10. java 中jtable_java中使用JTable控件