一、符号修饰与函数签名

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. stand up meeting 12-9

    今天项目小组本已约好在今天下午四点半进行今天的daily scrum: 但是在四点半的时候,天赋和士杰同学均因组内项目会议延时,导致今天的daily scrum只能在晚上进行,但静雯同学因身体不舒服无 ...

  2. 并查集判树 poj 1308

    例题: poj 1308 题目大意比较简单,对任意两个点,有且仅有一条道路,也就是一棵树. 题解:一棵树中,肯定是不能有环的,而且只能由一个根节点.(没认真读题,只知道在那里判环....),所以这个题 ...

  3. 从零开始学习docker之docker的安装

    一.Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程 ...

  4. Calendar日历类

    package com.yhqtv.demo02.ThreadPool; import java.util.Calendar; import java.util.Date; /* * java.uti ...

  5. java中String StringBuilder StringBuffer比较和效率(性能)测试

    string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...

  6. 易学又实用的新特性:for...of

    今天带来的知识点既简单又使用,是不是感觉非常的棒啊,OK,不多说了,咱们开始往下看. for...of 是什么 for...of 一种用于遍历数据结构的方法.它可遍历的对象包括数组,对象,字符串,se ...

  7. 数据库 MySQL 练习

    一.sql语句基础 1.顯示德國 Germany 的人口 SELECT population FROM world  WHERE name = 'Germany' 2.查詢面積為 5,000,000 ...

  8. 哈希Hash定义

    Hash,一般翻译做"散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值. ...

  9. view-controller

    有的时候我们只想根据一个请求地址跳转到一个页面中,中间并没有任何的处理流程,这个时候创建一个 Controller 类再编写方法来跳转就显得很繁琐.这个时候我们就可以使用 view-controlle ...

  10. Lambda表达式最佳实践

    简介 Lambda表达式java 8引入的函数式编程框架.之前的文章中我们也讲过Lambda表达式的基本用法. 本文将会在之前的文章基础上更加详细的讲解Lambda表达式在实际应用中的最佳实践经验. ...