C 中的可呼叫物件

2021-06-20 23:46:31 字數 2156 閱讀 2303

之前對c++中的多種可呼叫物件的使用總感覺很模糊,今天重新翻看了一下,總結成文如下。

c++中有如下幾種可呼叫物件:函式、函式指標、lambda表示式、bind物件、函式物件。其中lambda表示式和bind物件是c++11標準中提出的(bind機制並不是新標準中首次提出,而是對舊版本中bind1st和bind2st的合併)。個人認為五種可呼叫物件中,函式和函式指標本質相同,而lambda表示式、bind物件及函式物件則異曲同工。下面分別給出五種呼叫的使用:

1、函式。保證了對c的相容。

2、函式指標。和陣列名一樣,函式名即為函式指標。

void fff(int x)

捕獲列表用於接收lambda表示式所在函式中的區域性變數,如果要在執行體中用到這些變數,必須在捕獲列表中指定。捕獲列表只用於區域性非static變數,對於區域性static變數和它所在函式之外宣告的全域性的名字,lambda表示式可以直接使用。捕獲列表中既可以進行值傳遞,也可以進行引用傳遞,需要注意的是:在進行值傳遞的時候是在lambda表示式建立的時候拷貝值,而不是在呼叫的時候拷貝值,見下例:

void fcn1();//建立lambda表示式,如果引數列表為空,可以省去()

v1=0;//改變v1的值

auto j=f(); //呼叫lambda表示式,j的值為42

}

如果執行體內只有單一的return語句,那麼lambda表示式可以不指明返回型別,但如果執行體內還有其他語句,那麼lambda語句必須指明返回型別,並且返回型別必須尾置。

另外,lambda的捕獲列表在一定程度上彌補了標準庫中某些演算法在使用謂詞上的不便。例如標準庫中find_if演算法的第三個引數接收乙個一元謂詞,因此傳遞給find_if的可呼叫物件必須接收單一引數。現在有這樣乙個任務,words是乙個存放了若干單詞的vector物件,現在要從中找出長度大於指定長度sz的第乙個單詞。見以下**:

bool check(const string &a,string::size_type st)

vector::iterator first(const vector&words,string::size_type st));//正確,這裡的lambda表示式是一元謂詞,只傳遞了乙個引數

return wc;

}

當編譯器遇到lambda表示式時,編譯器會為lambda表示式生產乙個無名類的無名物件,類中過載了函式呼叫運算子,對應了lambda表示式的執行體,捕獲列表中捕獲到的值會在無名類中生產乙個對應的private成員變數。上例中的lambda表示式對應的無名類見以下**:

class 無名

private:

string::size_type st;

}

無名類中的函式呼叫運算子預設是const的,因此lambda表示式預設是不能對捕獲列表中捕獲的變數進行修改的,如果想修改,必須在lambda表示式的引數列表之後和執行體之前加上mutable關鍵字。見下例:

void fcn()//錯誤,不能修改v

auto f=[v]()mutable //正確,可以修改v

v=0;

int j=f();//j為101

}

4、bind函式。定義在標頭檔案functional中,可以將bind函式看做乙個通用的函式介面卡,它生產乙個可呼叫物件來「適應」原物件的引數列表。bind的一般呼叫形式如下:

auto newcallable = bind( callable,arg_list )

newcallable是由bind生成的新的可呼叫物件,callable是原物件,arg_list引數列表對應了原物件的引數列表。

例如對於之前的find_if的第三個引數,我們也可以用bind函式來書寫:

auto wc=find_if(words.begin(),words.end(),bind(check,_1,st));
說明:_1是佔位符,表明新生產的可呼叫物件的第乙個引數對應了原物件check的第乙個引數。st作為check的第二個引數。對於與句:auto g = bind(f,a,b,_2,c,_1);bind將函式g(_1,_2)對映為f(a,b,_2,c,_1)。

5、函式物件。過載了函式呼叫運算子的類的物件即為函式物件。

C 可呼叫物件

可呼叫物件 使用呼叫運算子來呼叫乙個可呼叫物件。呼叫運算子 為一對括號 裡面放置實參列表 可能為空 即匿名函式,不命名的可呼叫物件。每個lambda有它唯一的 未命名的,可以用auto宣告型別 類型別。完整結構 capture list parameter list return type 其中 r...

c 可呼叫物件 解惑

如有錯誤,還望指正。在閱讀書籍或者論壇的時候常常會遇到可呼叫物件的概念,很多人都沒有深入的理解這個概念,甚至有人會覺得函式就是可呼叫物件就是 函式,其實是不對的,在這裡給大家做一下詳細的解釋。可呼叫物件是c 長久以來存在的乙個概念,大體可以分為4種,分別是 1.函式指標 2.仿函式 3.可以被隱式轉...

C 可呼叫物件 function bind

void func int a intmain int argc,const char ar 仿函式定義 行為類似於函式的東西,c 中通過在類中過載 運算子實現。又稱函式物件 能行駛函式功能的類。class test intmain int argc,const char ar class test...