用C ++复制控件

时间:2012-11-26 13:23:18

标签: c++ constructor copy-constructor

template <class Type> class Queue {


    Queue(): head(0), tail(0) {
        cout << "Queue--default constructor called" << endl;
    }

    Queue(const Queue &Q): head(0), tail(0) {
        cout << "Queue--copy constructor called" << endl;
        //...
    }

    Queue& operator=(const Queue&) {
        cout << "Queue--operator= called" << endl;
        //...
    }
    ~Queue() { //... }

private:
    QueueItem<Type> *head;         
    QueueItem<Type> *tail;         
};

我已经定义了一个模板类Queue,并尝试了以下代码:

Queue<char*> cq;
Queue<char*> ccq(cq);   
Queue<char*> acq = cq;  
Queue<char*> acq2;
acq2 = cq;

输出是:

Queue--default constructor called
Queue--copy constructor called
Queue--copy constructor called
Queue--default constructor called
Queue--operator= called

让我感到困惑的是代码Queue<char*> acq = cq;调用了复制构造函数Queue--copy constructor called,但要调用default constructor and operator=

有人可以帮助我吗?

感谢您考虑我的问题!

2 个答案:

答案 0 :(得分:3)

这是在标准中定义的,它在Explicit initialization

部分中
  

1   显式初始化   [class.expl.init]   可以使用带括号的表达式列表初始化类类型的对象,其中表达式列表   被解释为被调用以初始化对象的构造函数的参数列表。或者,a   可以使用=初始化形式将single assignment-expression指定为初始化程序。或   直接初始化语义或复制初始化语义适用;见8.5。

这是描述single assignment-expressioncopy-initialization semantics的案例。

从技术上讲,两种表单ccq(cq)acq = cq之间没有区别,正如您从输出中看到的那样。

答案 1 :(得分:2)

这称为“复制初始化”,C ++标准要求

Queue<char*> acq  = cq;

应相当于

Queue<char*> acq (cq);

这里没有错。