一、符号修饰与函数签名

1、符号修饰

编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名。GCC的C++符号修饰方法如下:

1)所有符号都以_z开头

2)名字空间的名字

  名字空间(或类)的名字前加上N

  名字前还有一个数字,是名字的字符数。比如1C,1是C的长度。

3)函数名

  与名字空间一样,函数名前也有数字,比如4func,4是func的字符数。

4)参数

  参数以E开头

例子

N::C::func(int) 的函数签名经过修饰为_ZN1N1C4funcEi

2、函数签名

函数签名组成部分:包括函数名,参数类型,参数个数和顺序,以及它所在类和命名空间。

以上任何一个部分的不同,都会导致符号修饰后的名词不同,即导致函数签名不同,故可以区分不同的函数,在调用的时候就不会出错。

二、函数指针

例子: int(*p)(int,int)

语句定义了一个指向函数的指针变量P,这个函数指针可以指向这么一个函数,即返回值为int类型,且有两个int参数的函数,指针p的类型为int(*)(int,int)。

函数指针的统一定义方式为:

函数返回类型(* 指针变量名)(函数参数列表)

简单用法:

int func(int x);     //定义一个函数

int (*p)(int x);    //定义一个函数指针

p=func;      //将函数func的首地址赋值给指针变量p

三、c++11中的匿名函数(lambda函数,lambda表达式)

C++11提供了对匿名函数的支持,称为lambda函数(也成为lambda表达式),形式如下

[capture](parameters)->return-type{body}

解析:

capture

  1)、[]        //未定义变量,试图在lambda函数内使用任何外部变量都是错误的

  2)、[x,&y]      //x按值捕获,y按引用捕获

  3)、[&]       //用到的任何外部变量都隐式按引用捕获

  4)、[=]       //用到的任何外部变量都隐式按值捕获

  5)、[&,x]      //x显式按值捕获,其他变量按照引用捕获

  6)、[=,&z]     //z按引用捕获,其他变量按值捕获

parameters:存储函数的参数,当parameters为空的时候,()可以省去

return-type:函数的返回值,如果funtion body中存在return语句,则该lambda表达式的返回类型由return语句的返回类型确定。

body:函数体

例子:

auto fun=[](int x){ return x; }

cout<<fun(1)<<endl;      //输出1

四、仿函数

本质:仿函数的本质就是类重载了一个operator(),创建一个行为类似函数的对象。

例子:

template<class T>

stuct plus:public binary_function<T,T,T>{

  T operator()(const  T &x,const T &y) const{return x-y;}

};

cout<<"plus="<<plus<int>(2,1)<<endl;        //输出1

五、std::function与std::bind本质

1、std::finction

  std::function是函数模板类(是一个类);std::bind是函数模板(是一个函数),其包含在#include<functional>文件中。

std::function 即把函数对象化,将函数当作一个类的对象,主要目的是期望看到更多的泛型算法,不希望看到使用函数取操作数据的代码

通过std::function对C++中各种可调用实体(普通函数、lambda表达式,函数指针、以及其他的函数对象等)的封装,形成一个新的可调用的std::function对象,让我们不再纠结那么的的可调用实体。

例子:

1)、std::function<int(int a)> func      //声明一个std::function对象

2)、int test(int){return a};            //普通函数

3)、auto test=[](int a)->int{return a}   //匿名函数

4)、class test{              //仿函数

public:

  int operator()(int a){

    return a;

  }

};

5)、class test{            //类成员函数&类静态函数

   public:

      int tseta(int a){return a}

      static int testb(int a){return a;}

};

//调用

//1、普通函数

func=test;

func(1);

//2、匿名函数

func=test

func(1);

//3、仿函数

test t;

func=t;

func(1);

//4、类成员函数

test t;

func=std::bind(&test::testa, t ,std::placeholder::_1);     //std::placeholder::_1 :占位符号

func(1);

//5、类静态成员函数

func=test::testb;

func(1);

2、std::bind

std::bind可以看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表。

作用:

1)std::bind将可调用对象和其参数绑定成一个仿函数

2)只绑定部分参数,减少可调用对象传入的参数

例子:

//1、绑定普通函数

int test_a(int x,inty){return x+y;}

auto test_A=std::bind(test_a,_1,10);        //_1:占位符

test_A(2);                    //12

//2、绑定类成员函数

struct test_struct{

  int test_b(int x,int y){

    return x+y;

  }

};

test_struct test_tt;

auto test_B=std::bind(&test_struct::test_b,&test_tt,20,30);       //第一个参数为类成员函数的指针(必须显示指定函数,编译器不帮忙),第二个参数为类对象的地址(指明哪个对象的指针),后面两个为函数test_b的两个参数

test_B();              //50

c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind的更多相关文章

  1. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  2. JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

    “JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是 ...

  3. 洗礼灵魂,修炼python(24)--自定义函数(5)—匿名函数lambda

    在这个互联网时代,大家都喜欢匿名,匿名上网,匿名登录,匿名操作等等,都不喜欢实名对吧?(虽然说现在实名制已经快到来,题外话,扯远了),当然python里也有个不喜欢实名的,它的功效优点特殊,说强大吧? ...

  4. js闭包(函数内部嵌套一个匿名函数:这个匿名函数可将所在函数的局部变量常驻内存)

    js闭包(函数内部嵌套一个匿名函数:这个匿名函数可将所在函数的局部变量常驻内存) 一.总结 1.闭包:就是在一个函数内部嵌套一个匿名函数,这个匿名函数可以访问这个函数的变量. 二.要点 闭包 闭包的相 ...

  5. php 回调函数结合闭包(匿名函数)的使用示例

    <?php /** * php 回调函数结合闭包(匿名函数)的使用 */ function callback( $callback ){ $variable = 'program'; $ret1 ...

  6. Python:Base4(map,reduce,filter,自定义排序函数(sorted),返回函数,闭包,匿名函数(lambda) )

    1.python把函数作为参数: 在2.1小节中,我们讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x, y, f): return f(x) + f(y) 如果传入abs作为参数 ...

  7. C++11 std::function、std::bind和lambda表达式

    参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html 一.关于std::function与std::bin ...

  8. C++11新特性应用--实现延时求值(std::function和std::bind)

    说是延时求值,注意还是想搞一搞std::function和std::bind. 之前博客<C++11新特性之std::function>注意是std::function怎样实现回调函数. ...

  9. C++11 带来的新特性 (4)—— 匿名函数(Lambdas)

    1 语法 Lambdas并不是新概念,在其它语言中已经烂大街了.直接进入主题,先看语法: [ captures ] ( params ) specifiers exception attr -> ...

随机推荐

  1. Jingwen‘s update

    Bugs: The checkin button of the question answering page must be pressed twice to check in the result ...

  2. Daily Scrum 1/18/2016

    Yandong & Zhaoyang: Prepare bug bash slides for Beta release; Dong & Fuchen:Prepare demo for ...

  3. 微信小程序之base64图片如何预览与一键保存到本地相册?

    需求:由于后台服务器各方面的限制,现在服务器返回的图片是base64格式的,小程序端需要支持预览图片和多个图片一键下载功能 一.如何预览base64位图片? WXML页面:item.src的值是bas ...

  4. Scrapy学习-(1)

    Scrapy框架介绍 Scrapy是一个非常优秀的爬虫框架,基于python. 只需要在cmd运行pip install scrapy就可以自动安装.用scrapy-h检验是否成功安装 Scrapy部 ...

  5. Python的6种方式实现单例模式

    单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指向同一个内存地址,仅仅只有一个实例(只有一个对象). 实现单例模式的手段有很多种,但总的原则是保证一个类只要实例化一个 ...

  6. 2020新Asp.NET敏捷快速开发框架7.0.5旗舰版源码asp.net mvc框架,工具类CRM,工作流

    演示地址: http://frame3.diytassel.com  用户名:system  密码:0000    需要的联系QQ:22539134 一.新添加了 1.多语言功能: 2.代码生成器模版 ...

  7. C# 基础知识系列- 13 常见类库介绍(二)日期时间类

    0. 前言 上一篇内容介绍了Console类和Math类,这篇内容着重介绍一下C#中时间日期的处理方式. 上一篇勘误: 上一篇中关于静态类没有构造函数,这一表述有误.正确的说法是C#中静态类不包含常规 ...

  8. 异常处理的方式二:throws+异常类型

    package com.yhqtv.demo01Exception; import java.io.File; import java.io.FileInputStream; import java. ...

  9. 从Mac中完全删除office

    sudo sh -c "curl -s https://raw.githubusercontent.com/jimye/OfficeUninstall/master/office_unins ...

  10. js html生成图片

    我自己分装好的方法,外链自己去下: /** * !!!使用前请导入jq文件!!! 海报生成, 二维码链接生成 */ document.write('<script src="/Publ ...