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

Posted

技术标签:

【中文标题】参数化构造函数和函数对象调用如何协同工作?【英文标题】:How does parameterized constructor and functional object invocation work together? 【发布时间】:2016-08-11 00:09:44 【问题描述】:

在下面的代码中,考虑转换函数。传递给它的功能对象是 Add(10)。这意味着 Add a = Add(10) 或 Add a = 10 是有效的。 据我了解,Add(10) 使用一个参数调用构造函数,并且 _v 将被初始化为向量的值。所以最初在执行 + _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】:

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

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

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

当函数对象被调用时(参见operators overloading),它会接受和int 并返回int 加上存储在_v 中的值(10 在你的情况下)。

标准函数transform是这样工作的:

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

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

在你的情况下:

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

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

【讨论】:

以上是关于参数化构造函数和函数对象调用如何协同工作?的主要内容,如果未能解决你的问题,请参考以下文章

spring的IOC和AOP协同工作

面向对象 课堂基础笔记

基于学习排序的并行协同过滤推荐算法

如何从 getopt 中获取参数以协同工作

java中类和对象如何协同工作, 这样工作有什么好处?

深入类的方法