一、符号修饰与函数签名

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. day18作业

    作业: # 1.编写课上讲解的有参装饰器准备明天默写 def auth(file_type): def outer(func): def inter(*args,**kwargs): if file_ ...

  2. O - Navigation System CodeForces - 1321D

    题目大意:有一个导航系统,会根据你当前的位置,规划到目的地的最短路线,给你一个有向图,和一条行驶路径,问你导航重新规划路径的最大次数和最小次数. 读题的时候题意特别不理解,何为最大次数,何为最小次数? ...

  3. sqli-labs通关教程----31~40关

    第三十一关 这关一样,闭合变成(",简单测试,#号不能用 ?id=1") and ("1")=("1")--+ 第三十二关 这关会把我们的输 ...

  4. winfrom 基础

    1 winfrom就是一种窗体开发端应用程序 2 窗体分类 1)记事本类:可以最大最小化,可以拖拽                                                窗体默 ...

  5. HTTPoxy漏洞(CVE-2016-5385)复现记录

    漏洞介绍: httpoxy是cgi中的一个环境变量:而服务器和CGI程序之间通信,一般是通过进程的环境变量和管道. CGI介绍 CGI 目前由 NCSA 维护,NCSA 定义 CGI 如下:CGI(C ...

  6. pytorch中tensor的属性 类型转换 形状变换 转置 最大值

    import torch import numpy as np a = torch.tensor([[[1]]]) #只有一个数据的时候,获取其数值 print(a.item()) #tensor转化 ...

  7. 7、窗口函数 & Windows 的 Operator demo

    代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 一.窗口函数 在定义了窗口分配器之后,我们需要为每一个窗口明确的指定计算逻辑,这个就是窗口函数要做的事情,当 ...

  8. php 通过 yield 实现协程有什么使用场景

    来源:https://segmentfault.com/q/1010000010018151 参考:https://www.cnblogs.com/lynxcat/p/7954456.html 协程可 ...

  9. python学习03字符串基本操作

    '''字符串可以用单引号,双引号,三引号表示 '''#1.读取str1='I am a student!'#每一个字符对应一个下标,可以利用下标的方式来读取字符串对应的值——索引print(str1[ ...

  10. [Python] bytes 转换成 str

    b = b"example" # bytes object s = "example" # str object sb = bytes(s, encoding ...