std :: containers调用的复制构造函数是否包含复制构造函数?

时间:2011-07-27 18:46:46

标签: c++ containers std copy-constructor deep-copy

包含对象指针的任何std :: container(特别是std :: queue)的复制构造函数是否调用成员的复制构造函数以允许深层复制,还是对指针值执行浅复制?

示例:

/*******************************************************************************
 * <summary>
 *  Initializes a new instance of the EventHandler class.
 * </summary>
 *
 * <param name="handler">The handler to copy.</param>
*******************************************************************************/
EventHandler::EventHandler(const EventHandler& handler) : _eventQueue(handler._eventQueue) { }

_eventQueue声明为:std::queue<Event*> _eventQueue;其中Event是一个带有复制构造函数的Base类,并且有多个派生类和它们自己的复制构造函数。

P.S。:我喜欢AtomineerUtilsVisualAssistX(尤其是合并时!:D)

修改

鉴于以下答案,这是否是创建原件副本的正确方法,使原件未经修改或复制与原件相反(简单修复但仍然是一个重要的区别)?

EventHandler::EventHandler(const EventHandler& handler) {
    for(size_t i = 0; i < handler._eventQueue.size(); ++i) {
        this->_eventQueue.push(new Event(handler._eventQueue._Get_container().at(i)));
    }
}

2 个答案:

答案 0 :(得分:5)

执行深层复制(在包含的对象上)。

因此所有包含的元素都被复制到新容器中。

但是因为你的容器包含指针,

std::queue<Event*>   eventQueue;

它只复制指针Event*(因为这是包含的对象)。在这种情况下,容器元素指向的对象是复制..

答案 1 :(得分:0)

std :: queue是一个适配器(默认为deque),因此它存储了一个对象的副本,但是因为你这样使用它:

std::queue< Event* >

然后容器的值是指针类型,只复制指针。