参数化构造函数和函数对象调用如何协同工作?
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 function,Add(10)
的一个实例。所以operator()
是为向量的每个元素调用的(这就是为什么Add
的operator()
将整数作为输入参数)并返回一个新的整数x + 10
。
简而言之,向量的每个整数都由Add
对象的operator()
转换,该对象给出并求和10。
【讨论】:
以上是关于参数化构造函数和函数对象调用如何协同工作?的主要内容,如果未能解决你的问题,请参考以下文章