在for循环中使用push_front并不会永久地将成员添加到列表中

时间:2014-07-17 22:20:01

标签: c++ list loops constructor destructor

我正在尝试在我创建的类的列表上使用push_front()函数。我在for循环中有它,但每当循环将新成员插入到列表中时,它会立即自动销毁,我假设因为它超出了范围。我的问题是如何永久添加这些项目。

示例:

class foo
{
public:
    foo(){std::cout << "creation" << std::endl;}
    ~foo(){std::cout << "destruction" << std::endl;}
    bool create() {return true;}
};

int main()
{
    std::list<foo> foolist(4);
    for (std::list<foo>::iterator i=foolist.begin(); i!=foolist.end(); i++)
    {
        foolist.push_front(foo());
    }
    return 0;
}

这是我得到的输出:

creation
creation
creation
creation
creation
destruction
creation
destruction
creation
destruction
creation
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction

这是我想要实现的目标:

creation
creation
creation
creation
creation
creation
creation
creation
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction

2 个答案:

答案 0 :(得分:5)

让我们一次一行地浏览这个程序。

std::list<foo> foolist(4);

foo的默认构造函数被调用4次。

foolist.push_front(foo());

此声明运行4次。每次都默认构造foopush_front调用隐式定义的移动构造函数,以便将此临时foo对象移动到列表中。 (或者如果您仍处于C ++ 03模式,则为复制构造函数。)您不会看到任何打印的内容,因为它不是默认构造函数。在每次迭代结束时,临时foo将被销毁。

    return 0;
}

列表现在包含8个foo s,因此析构函数被调用8次。

答案 1 :(得分:2)

额外的&#34;创造&#34;和#34;破坏&#34;是由于您通过调用

创建的临时变量
foo()

这些临时变量被复制到列表中的全新项目中,当列表超出范围时,在调用push_front时会创建这些项目并将其销毁