欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind

 更新時(shí)間:2020年05月14日 09:43:21   作者:快牽著我的襪子  
這篇文章主要介紹了c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、符號(hào)修飾與函數(shù)簽名

1、符號(hào)修飾

編譯器將c++源代碼編譯成目標(biāo)文件時(shí),用函數(shù)簽名的信息對(duì)函數(shù)名進(jìn)行改編,形成修飾名。GCC的C++符號(hào)修飾方法如下:

1)所有符號(hào)都以_z開頭

2)名字空間的名字

名字空間(或類)的名字前加上N

名字前還有一個(gè)數(shù)字,是名字的字符數(shù)。比如1C,1是C的長度。

3)函數(shù)名

與名字空間一樣,函數(shù)名前也有數(shù)字,比如4func,4是func的字符數(shù)。

4)參數(shù)

參數(shù)以E開頭

例子

N::C::func(int) 的函數(shù)簽名經(jīng)過修飾為_ZN1N1C4funcEi

2、函數(shù)簽名

函數(shù)簽名組成部分:包括函數(shù)名,參數(shù)類型,參數(shù)個(gè)數(shù)和順序,以及它所在類和命名空間。

以上任何一個(gè)部分的不同,都會(huì)導(dǎo)致符號(hào)修飾后的名詞不同,即導(dǎo)致函數(shù)簽名不同,故可以區(qū)分不同的函數(shù),在調(diào)用的時(shí)候就不會(huì)出錯(cuò)。

二、函數(shù)指針

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

語句定義了一個(gè)指向函數(shù)的指針變量P,這個(gè)函數(shù)指針可以指向這么一個(gè)函數(shù),即返回值為int類型,且有兩個(gè)int參數(shù)的函數(shù),指針p的類型為int(*)(int,int)。

函數(shù)指針的統(tǒng)一定義方式為:

函數(shù)返回類型(* 指針變量名)(函數(shù)參數(shù)列表)

簡單用法:

int func(int x); //定義一個(gè)函數(shù)

int (*p)(int x);//定義一個(gè)函數(shù)指針

p=func;//將函數(shù)func的首地址賦值給指針變量p

三、c++11中的匿名函數(shù)(lambda函數(shù),lambda表達(dá)式)

C++11提供了對(duì)匿名函數(shù)的支持,稱為lambda函數(shù)(也成為lambda表達(dá)式),形式如下

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

解析:

capture

1)、[]//未定義變量,試圖在lambda函數(shù)內(nèi)使用任何外部變量都是錯(cuò)誤的

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

3)、[&]//用到的任何外部變量都隱式按引用捕獲

4)、[=]//用到的任何外部變量都隱式按值捕獲

5)、[&,x]//x顯式按值捕獲,其他變量按照引用捕獲

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

parameters:存儲(chǔ)函數(shù)的參數(shù),當(dāng)parameters為空的時(shí)候,()可以省去

return-type:函數(shù)的返回值,如果funtion body中存在return語句,則該lambda表達(dá)式的返回類型由return語句的返回類型確定。

body:函數(shù)體

例子:

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

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

四、仿函數(shù)

本質(zhì):仿函數(shù)的本質(zhì)就是類重載了一個(gè)operator(),創(chuàng)建一個(gè)行為類似函數(shù)的對(duì)象。

例子:

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本質(zhì)

1、std::finction

std::function是函數(shù)模板類(是一個(gè)類);std::bind是函數(shù)模板(是一個(gè)函數(shù)),其包含在#include<functional>文件中。

std::function 即把函數(shù)對(duì)象化,將函數(shù)當(dāng)作一個(gè)類的對(duì)象,主要目的是期望看到更多的泛型算法,不希望看到使用函數(shù)取操作數(shù)據(jù)的代碼

通過std::function對(duì)C++中各種可調(diào)用實(shí)體(普通函數(shù)、lambda表達(dá)式,函數(shù)指針、以及其他的函數(shù)對(duì)象等)的封裝,形成一個(gè)新的可調(diào)用的std::function對(duì)象,讓我們不再糾結(jié)那么的的可調(diào)用實(shí)體。

例子:

1)、std::function<int(int a)> func//聲明一個(gè)std::function對(duì)象

2)、int test(int){return a};//普通函數(shù)

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

4)、class test{//仿函數(shù)

public:
int operator()(int a){
return a;
}
};

5)、class test{//類成員函數(shù)&類靜態(tài)函數(shù)

public:
int tseta(int a){return a}
static int testb(int a){return a;}
};
//調(diào)用
//1、普通函數(shù)
func=test;
func(1);
//2、匿名函數(shù)
func=test
func(1);
//3、仿函數(shù)
test t;
func=t;
func(1);
//4、類成員函數(shù)
test t;
func=std::bind(&test::testa, t ,std::placeholder::_1); //std::placeholder::_1 :占位符號(hào)
func(1);
//5、類靜態(tài)成員函數(shù)
func=test::testb;
func(1);

2、std::bind

std::bind可以看作一個(gè)通用的函數(shù)適配器,它接受一個(gè)可調(diào)用對(duì)象,生成一個(gè)新的可調(diào)用對(duì)象來適應(yīng)原對(duì)象的參數(shù)列表。

作用:

1)std::bind將可調(diào)用對(duì)象和其參數(shù)綁定成一個(gè)仿函數(shù)

2)只綁定部分參數(shù),減少可調(diào)用對(duì)象傳入的參數(shù)

例子:

//1、綁定普通函數(shù)
int test_a(int x,inty){return x+y;}
auto test_A=std::bind(test_a,_1,10);//_1:占位符
test_A(2);//12
//2、綁定類成員函數(shù)
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); //第一個(gè)參數(shù)為類成員函數(shù)的指針(必須顯示指定函數(shù),編譯器不幫忙),第二個(gè)參數(shù)為類對(duì)象的地址(指明哪個(gè)對(duì)象的指針),后面兩個(gè)為函數(shù)test_b的兩個(gè)參數(shù)
test_B();//50

總結(jié)

到此這篇關(guān)于c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind的文章就介紹到這了,更多相關(guān)c++11 符號(hào)修飾符與函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 實(shí)現(xiàn)即時(shí)通信的示例代碼(直接運(yùn)行)

    C++ 實(shí)現(xiàn)即時(shí)通信的示例代碼(直接運(yùn)行)

    本文主要介紹了C++ 實(shí)現(xiàn)即時(shí)通信的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C語言開發(fā)實(shí)現(xiàn)井字棋及電腦落子優(yōu)化示例詳解

    C語言開發(fā)實(shí)現(xiàn)井字棋及電腦落子優(yōu)化示例詳解

    以前上課經(jīng)常和同桌玩起井字棋,那么我們就當(dāng)我們回憶童年,現(xiàn)在也用C語言來實(shí)現(xiàn)井字棋,本次代碼相對(duì)于初階的井字棋,在電腦下棋代碼部分做了優(yōu)化,使得電腦更加具有威脅
    2021-11-11
  • 200行C語言代碼實(shí)現(xiàn)簡易三子棋游戲

    200行C語言代碼實(shí)現(xiàn)簡易三子棋游戲

    三子棋(井字棋)我們的童年或多或少都體驗(yàn)過這個(gè)游戲的樂趣,本子隨手一畫就是一局游戲的開始,下面這篇文章主要給大家介紹了關(guān)于200行C語言代碼實(shí)現(xiàn)簡易三子棋游戲的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 用C語言實(shí)現(xiàn)二分查找算法

    用C語言實(shí)現(xiàn)二分查找算法

    大家好,本篇文章主要講的是c語言實(shí)現(xiàn)二分查找法,感性的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • c++ map,mutimap刪除問題分析

    c++ map,mutimap刪除問題分析

    本文詳細(xì)介紹c++ map,mutimap刪除操作時(shí)的一些問題,提供了解決方法,需要的朋友可以參考下
    2012-11-11
  • c語言中缺省參數(shù)的類型總結(jié)

    c語言中缺省參數(shù)的類型總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于c語言中缺省參數(shù)的類型總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-09-09
  • C++移動(dòng)語義詳細(xì)介紹使用

    C++移動(dòng)語義詳細(xì)介紹使用

    首先,移動(dòng)語義和完美轉(zhuǎn)發(fā)這兩個(gè)概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會(huì)從C++的值類型,到移動(dòng)拷貝與移動(dòng)賦值來理解移動(dòng)語義與完美轉(zhuǎn)發(fā)
    2023-01-01
  • static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解

    static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解

    以下是對(duì)static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • Ubuntu配置sublime text 3的c編譯環(huán)境的具體步驟

    Ubuntu配置sublime text 3的c編譯環(huán)境的具體步驟

    下面小編就為大家?guī)硪黄猆buntu配置sublime text 3的c編譯環(huán)境的具體步驟。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 舉例分析private的作用(c/c++學(xué)習(xí))

    舉例分析private的作用(c/c++學(xué)習(xí))

    我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來,但是還是搞不懂private該怎么用,或者說在一個(gè)具體程序中,private有什么用
    2020-08-08

最新評(píng)論