c++11 符號(hào)修飾與函數(shù)簽名、函數(shù)指針、匿名函數(shù)、仿函數(shù)、std::function與std::bind
一、符號(hào)修飾與函數(shù)簽名
1、符號(hào)修飾
編譯器將c++源代碼編譯成目標(biāo)文件時(shí),用函數(shù)簽名的信息對(duì)函數(shù)名進(jìn)行改編,形成修飾名。GCC的C++符號(hào)修飾方法如下:
1)所有符號(hào)都以_z開(kāi)頭
2)名字空間的名字
名字空間(或類(lèi))的名字前加上N
名字前還有一個(gè)數(shù)字,是名字的字符數(shù)。比如1C,1是C的長(zhǎng)度。
3)函數(shù)名
與名字空間一樣,函數(shù)名前也有數(shù)字,比如4func,4是func的字符數(shù)。
4)參數(shù)
參數(shù)以E開(kāi)頭
例子
N::C::func(int) 的函數(shù)簽名經(jīng)過(guò)修飾為_(kāi)ZN1N1C4funcEi
2、函數(shù)簽名
函數(shù)簽名組成部分:包括函數(shù)名,參數(shù)類(lèi)型,參數(shù)個(gè)數(shù)和順序,以及它所在類(lèi)和命名空間。
以上任何一個(gè)部分的不同,都會(huì)導(dǎo)致符號(hào)修飾后的名詞不同,即導(dǎo)致函數(shù)簽名不同,故可以區(qū)分不同的函數(shù),在調(diào)用的時(shí)候就不會(huì)出錯(cuò)。
二、函數(shù)指針
例子: int(*p)(int,int)
語(yǔ)句定義了一個(gè)指向函數(shù)的指針變量P,這個(gè)函數(shù)指針可以指向這么一個(gè)函數(shù),即返回值為int類(lèi)型,且有兩個(gè)int參數(shù)的函數(shù),指針p的類(lèi)型為int(*)(int,int)。
函數(shù)指針的統(tǒng)一定義方式為:
函數(shù)返回類(lèi)型(* 指針變量名)(函數(shù)參數(shù)列表)
簡(jiǎn)單用法:
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ù)的支持,稱(chēng)為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語(yǔ)句,則該lambda表達(dá)式的返回類(lèi)型由return語(yǔ)句的返回類(lèi)型確定。
body:函數(shù)體
例子:
auto fun=[](int x){ return x; }
cout<<fun(1)<<endl;//輸出1
四、仿函數(shù)
本質(zhì):仿函數(shù)的本質(zhì)就是類(lèi)重載了一個(gè)operator(),創(chuàng)建一個(gè)行為類(lèi)似函數(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ù)模板類(lèi)(是一個(gè)類(lèi));std::bind是函數(shù)模板(是一個(gè)函數(shù)),其包含在#include<functional>文件中。
std::function 即把函數(shù)對(duì)象化,將函數(shù)當(dāng)作一個(gè)類(lèi)的對(duì)象,主要目的是期望看到更多的泛型算法,不希望看到使用函數(shù)取操作數(shù)據(jù)的代碼
通過(guò)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{//類(lèi)成員函數(shù)&類(lèi)靜態(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、類(lèi)成員函數(shù) test t; func=std::bind(&test::testa, t ,std::placeholder::_1); //std::placeholder::_1 :占位符號(hào) func(1); //5、類(lèi)靜態(tài)成員函數(shù) func=test::testb; func(1);
2、std::bind
std::bind可以看作一個(gè)通用的函數(shù)適配器,它接受一個(gè)可調(diào)用對(duì)象,生成一個(gè)新的可調(diào)用對(duì)象來(lái)適應(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、綁定類(lèi)成員函數(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ù)為類(lèi)成員函數(shù)的指針(必須顯示指定函數(shù),編譯器不幫忙),第二個(gè)參數(shù)為類(lèi)對(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í)通信的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)井字棋及電腦落子優(yōu)化示例詳解
以前上課經(jīng)常和同桌玩起井字棋,那么我們就當(dāng)我們回憶童年,現(xiàn)在也用C語(yǔ)言來(lái)實(shí)現(xiàn)井字棋,本次代碼相對(duì)于初階的井字棋,在電腦下棋代碼部分做了優(yōu)化,使得電腦更加具有威脅2021-11-11200行C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲
三子棋(井字棋)我們的童年或多或少都體驗(yàn)過(guò)這個(gè)游戲的樂(lè)趣,本子隨手一畫(huà)就是一局游戲的開(kāi)始,下面這篇文章主要給大家介紹了關(guān)于200行C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲的相關(guān)資料,需要的朋友可以參考下2023-05-05c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-09-09static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解
以下是對(duì)static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09Ubuntu配置sublime text 3的c編譯環(huán)境的具體步驟
下面小編就為大家?guī)?lái)一篇Ubuntu配置sublime text 3的c編譯環(huán)境的具體步驟。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03舉例分析private的作用(c/c++學(xué)習(xí))
我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來(lái),但是還是搞不懂private該怎么用,或者說(shuō)在一個(gè)具體程序中,private有什么用2020-08-08