下面的例子让我很困惑。到目前为止,我一直在想,当使用仿函数时,对象会被构造一次,并且同一个对象会被多次使用,当与 for_each 算法一起使用时,这似乎是正确的。
然而,尽管只构造了一个对象,但销毁了多个对象。现在,这打败了我。
class print
{
public:
void operator()(int i)
{
std::cout << i << std::endl;
}
print()
{
std::cout << "Constructor " << std::endl;
}
~print()
{
std::cout << "Destructor" << std::endl;
}
};
int main()
{
std::vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
std::cout << "After assigning values " << std::endl;
for_each(v.begin() , v.end() , print());
std::cout << "After printing values " << std::endl;
}
输出结果如下
After assigning Values
Constructor
10
20
30
Destructor
Destructor
Destructor
After printing values.
这怎么可能?
最佳答案
不要忘记复制构造函数(Rule of Three 可以帮助您记住这一点):
class print
{
public:
void operator()(int i)
{
std::cout << i << std::endl;
}
print()
{
std::cout << "Constructor " << std::endl;
}
print(const print& other) {
std::cout << "Copy Constructor " << std::endl;
}
~print()
{
std::cout << "Destructor" << std::endl;
}
};
int main()
{
std::vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
std::cout << "After assigning values " << std::endl;
for_each(v.begin() , v.end() , print());
std::cout << "After printing values " << std::endl;
}
输出:
After assigning values Constructor Copy Constructor 10 20 30 Copy Constructor Destructor Destructor Destructor After printing values
关于c++ - 为什么使用仿函数时只构造了一个对象,但销毁了多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3508273/