C++学习笔记(一)mutable function

今天看代码的过程中,看到一个关键字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() const
12     {
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() const
12     {
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

原文地址:https://www.cnblogs.com/lyf-sunicey/p/8128010.html