c++ - 为什么使用仿函数时只构造了一个对象,但销毁了多个对象?

标签 c++ function stl object vector

下面的例子让我很困惑。到目前为止,我一直在想,当使用仿函数时,对象会被构造一次,并且同一个对象会被多次使用,当与 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/

相关文章:

c++ - gcc x86 Windows 堆栈对齐

java - 使用 ProcessingJS 将返回值从一个函数传递到另一个函数的语法?

将 u_int32_t 转换为 char **

c++ - C和C++的所有者是谁?

c++ - QT - 不同用途的最佳绘画 "canvas"

c++ - 如何绘制存储在 vector 中的 SFML 形状

c++ - 参数列表中的类型定义

c++ - 有没有快速创建集合的方法?

c++ - std::vector::swap 是否使迭代器无效?

c++ - 向用户公开 C++ 容器迭代器