参数化构造函数和函数对象调用如何协同工作?

时间:2016-08-11 00:09:44

标签: c++ visual-studio stl

在下面的代码中,考虑转换函数。传递给它的函数对象是Add(10)。这意味着添加a = Add(10)或Add a = 10有效。  根据我的理解,Add(10)用一个参数调用构造函数,_v将初始化为vector的值。因此,在执行+ _v之前,_v的值是向量的内容。添加后,vector的值将增加10。

任何人都可以澄清一下如何调用构造函数以及如何调用函数operator()(int a)?

代码:

struct Add
{
    int _v;
    Add(int v) : _v(v) {}
    int operator()(int a)
    {
       cout<<a; 
        return a + _v;
    }
};

int main()
{
    int t[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    vector<int> v1(t, t + 10);
    list<int> l1(v1.size());
    //Add a = Add(10);
    cout << "Source collection:\n";
    cout << "v1: "; for_each(v1.begin(), v1.end(), print<int>); cout << endl << endl;
    cout << "Adding value - 10 to all the elements of the collection:\n";
    transform(v1.begin(), v1.end(), l1.begin(), Add(10));
    cout << "l1: "; for_each(l1.begin(), l1.end(), print<int>); cout << endl << endl; 
return 0;
}

输出: 来源收藏: v1:1 2 3 4 5 6 7 8 9 10

为集合的所有元素添加值 - 10:

12345678910 l1:11 12 13 14 15 16 17 18 19 20

1 个答案:

答案 0 :(得分:0)

  

[...] Add(10)使用一个参数调用构造函数, _v将初始化为向量的值。 [...]

都能跟得上! _v将初始化为构造函数中作为参数传递的值。在您的情况下10

因此,您将构造一个对象(结构Add的实例),并将其变量成员_v)初始化为10

调用函数对象时(参见operators overloading),然后int并返回int加上_v中存储的值( 10 < / em>在你的情况下)。

标准函数transform以这种方式工作:

transform(v1.begin(), v1.end(), l1.begin(), Add(10));

获取一些输入,将它们应用于函数(转换)并将转换后的对象存储在某个输出中。

在你的情况下:

  • 采用输入范围,在本例中为所有向量v1// from v1.begin to v2.end)。
  • 采用输出迭代器(将放置转换后的元素),在您的情况下,您只需将矢量的转换元素存储到列表l1中。
  • 采用执行转换的功能。在您的情况下,该函数是对象函数,一个Add(10)的实例。因此operator()调用向量的每个元素(这就是operator() Add取整数作为输入参数的原因)并返回一个新的整数x + 10

简而言之,向量的每个整数都由operator() Add对象转换,该对象给出10和它的总和。