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開頭
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í)通信的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C語言開發(fā)實(shí)現(xiàn)井字棋及電腦落子優(yōu)化示例詳解
以前上課經(jīng)常和同桌玩起井字棋,那么我們就當(dāng)我們回憶童年,現(xiàn)在也用C語言來實(shí)現(xiàn)井字棋,本次代碼相對(duì)于初階的井字棋,在電腦下棋代碼部分做了優(yōu)化,使得電腦更加具有威脅2021-11-11static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解
以下是對(duì)static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09Ubuntu配置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í))
我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來,但是還是搞不懂private該怎么用,或者說在一個(gè)具體程序中,private有什么用2020-08-08