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

How does parameterized constructor and functional object invocation work together?

本文关键字:调用 协同工作 对象 函数 构造函数 参数      更新时间:2023-10-16

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

任何人都可以澄清如何调用构造函数以及如何调用函数运算符(((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

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

不! _v将初始化为在构造函数中作为参数传递的值。在您的情况下10.

所以你将构造一个对象(结构体Add的实例(,它的变量成员(_v(被初始化为10

当调用函数对象时(请参阅运算符重载(,然后它获取并int并返回该int加上存储在 _v 中的值(在本例中为 10(。

标准函数转换的工作方式如下:

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

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

在您的情况下:

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

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