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=
。
有人可以帮助我吗?
感谢您考虑我的问题!
答案 0 :(得分:3)
这是在标准中定义的,它在Explicit initialization
1 显式初始化 [class.expl.init] 可以使用带括号的表达式列表初始化类类型的对象,其中表达式列表 被解释为被调用以初始化对象的构造函数的参数列表。或者,a 可以使用=初始化形式将single assignment-expression指定为初始化程序。或 直接初始化语义或复制初始化语义适用;见8.5。
这是描述single assignment-expression
和copy-initialization semantics
的案例。
从技术上讲,两种表单ccq(cq)
和acq = cq
之间没有区别,正如您从输出中看到的那样。
答案 1 :(得分:2)
这称为“复制初始化”,C ++标准要求
Queue<char*> acq = cq;
应相当于
Queue<char*> acq (cq);
这里没有错。