0
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=调用要调用的。

任何人都可以帮助我吗?

谢谢你考虑我的问题!

4

2 回答 2

3

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

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

这是描述single assignment-expression和的情况copy-initialization semantics

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

于 2012-11-26T13:31:08.803 回答
2

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

Queue<char*> acq  = cq;

应相当于

Queue<char*> acq (cq);

这里没有错。

于 2012-11-26T13:28:53.067 回答