標籤: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