C++學習筆記(一)mutable function

來源:互聯網
上載者:User

標籤:argv   stream   作用   變數   log   details   style   ace   hub   

今天看代碼的過程中,看到一個關鍵字mutable

 

在這兒總結一下:mutable 譯義:可變的    也就是與const 作用是相反的

const強調不可變(為突破const的限制)

也就有了mutable永遠處於可變狀態(即使變數處於const函數中)

 

function

 通過std::function對C++中各種可調用實體(普通函數、Lambda運算式、函數指標、以及其它函數對象等)的封裝,形成一個新的可調用的std::function對象;讓我們不再糾結那麼多的可調用實體。

關於function的使用是從另外一個部落格裡面轉載過來的http://blog.csdn.net/hanbingfengying/article/details/28651507

 

 1 #include<functional> 2 #include<iostream> 3 #include<map> 4 using namespace std; 5  6 int add(int a, int b) { return a + b; } 7 auto mod = [](int a, int b) {return a % b;};//lambda運算式 8 struct divide {  9     int operator()(int a, int b) { 10         return a / b; 11     }12 };13 14 function<int(int, int)> func1 = add;15 function<int(int, int)> func2 = mod;16 function<int(int, int)>func3 = divide();17 18 map<string, function<int(int, int)> >funs = {19     {"+",add},20 {"/",divide()},21 {"*",[](int a,int b) {return a * b;}},22 {"%",mod}23 };24 int main() {25     cout << func1(1, 2) << endl;26     cout << func2(1, 2) << endl;27     cout << func3(1, 2) << endl;28     cout << funs["+"](4, 9) << endl;29     //cout <<  << endl;30     system("pause");31 }

 

 

 1 class CAdd 2 { 3 public: 4     CAdd():m_nSum(0){NULL;} 5     int operator()(int i) 6     { 7         m_nSum += i; 8         return m_nSum; 9     }10     11     int Sum() const12     {13         return m_nSum;14     }15     16 private:17     int m_nSum;18 };19 int main(int argc, const char * argv[])20 {21     CAdd cAdd;22     function<int(int)> funcAdd1 = cAdd;23     function<int(int)> funcAdd2 = cAdd;24     cout<<funcAdd1(10)<<endl;25     cout<<funcAdd2(10)<<endl;26     cout<<cAdd.Sum()<<endl;27     28      return 0;29 }

 輸出

 

上面的輸出結果是 10 10 0。我們將同一個函數對象賦值給了兩個function,然後分別調用這兩個function,但函數中的成員變數的值沒有儲存,問題在哪裡?因為function的預設行為是拷貝一份傳遞給它的函數對象,於是f1,f2中儲存的都是cAdd對象的拷貝。

C++11提供了ref和cref函數來提供對象的引用和常引用的封裝。要是function能夠正確儲存函數對象的狀態,可以如下修改

 1 class CAdd 2 { 3 public: 4     CAdd() :m_nSum(0) { NULL; } 5     int operator()(int i) 6     { 7         m_nSum += i; 8         return m_nSum; 9     }10 11     int Sum() const12     {13         return m_nSum;14     }15 16 private:17     int m_nSum;18 };19 int main(int argc, const char * argv[])20 {21     CAdd cAdd;22     function<int(int)> funcAdd1 = ref(cAdd);23     function<int(int)> funcAdd2 = ref(cAdd);24     cout << funcAdd1(10) << endl;25     cout << funcAdd2(10) << endl;26     cout << cAdd.Sum() << endl;27     system("pause");28     return 0;29 }

 

  另外,兩個function之間賦值時,如果源function儲存的是函數對象的拷貝,則目標function儲存的也是函數對象的拷貝。如果源function儲存的是對函數對象的引用,則目標function儲存的也是函數對象的引用。

做一個總結:http://blog.csdn.net/wangshubo1989/article/details/49134235

類模版std::function是一種通用、多態的函數封裝。std::function的執行個體可以對任何可以調用的目標實體進行儲存、複製、和叫用作業,這些目標實體包括普通函數、Lambda運算式、函數指標、以及其它函數對象等。std::function對象是對C++中現有的可調用實體的一種型別安全的包裹(我們知道像函數指標這類可調用實體,是類型不安全的)。

通常std::function是一個函數對象類,它封裝其它任意的函數對象,被封裝的函數對象具有類型為T1, …,TN的N個參數,並且返回一個可轉換到R類型的值。std::function使用 模板轉換建構函式接收被封裝的函數對象;特別是,閉包類型可以隱式地轉換為std::function。

最簡單的理解就是:

通過std::function對C++中各種可調用實體(普通函數、Lambda運算式、函數指標、以及其它函數對象等)的封裝,形成一個新的可調用的std::function對象;讓我們不再糾結那麼多的可調用實體。

 

參考:http://blog.csdn.net/xf_zhen/article/details/52224139

C++學習筆記(一)mutable function

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.