请教一个类模板初始化的问题
我最近在看《C++ Primer(第三版)》的类模板这一章,在Page675有这样的知识点:
[color=#FF0000]将类模板QueueItem的构造函数声明为const引用类型:
QueueItem(const Type&);
做这种设计的考虑之一就是在于这个构造函数的实现之中。如果用来实例化QueueItem的类型没有相关的构造函数,则可以接受下面的构造函数定义:
- C/C++ code
template <class Type>class QueueItem{ //...public: //可能效率很低 QueueItem(const Type& t) { item = t; next = 0; }};如果模板参数是一个具有构造函数的类(例如string),它将导致item被初始化2次!在QueueItem的构造函数体执行之前,string的缺省构造函数被调用来初始化item。然后重新构造的item又被按成员赋值。在QueueItem构造函数的定义中,我们只需在构造函数成员初始化表中显示地初始化item,就可以解决这个问题。
- C/C++ code
template <class Type>class QueueItem{ //...public: //可能效率很低 QueueItem(const Type& t) { item = t; next = 0; }};[/color]
我想问的是,为什么在构造函数成员初始化表中显示地初始化item就可以避免item被初始化2次?
求指导,感激不尽!
[解决办法]
没使用初始化列表的构造函数是对类的成员赋值,并没有进行显示的初始化。
就像你分成2步. class a; a = xx; 和 class a(xx);的区别
[解决办法]
说的是template <class Type>这个里面的Type参数,
如果是int的,
int item; int t;
再 item = t;
如果是你自己定义个类或者别的类,
class abc
{
...
}
abc item; abc t;
再 item = t;
在初始化列表里初始化是像这样
int item(t);
abc item(t);
这个描述的就是让人迷糊,不管啥类型,在构造函数里初始化都是两步,在初始化列表里就是一步。
[解决办法]
初始化列表中 调用的是 构造函数
构造函数中 item = t; 调的是赋值函数。这样的话,构造函数调用后,赋值函数又来一次
[解决办法]
楼主注意区分 初始化 和 赋值,
operator=是赋值的,
初始化列表就真的初始化了。
但是这跟编译器优化也有关系,
编译器很可能直接就优化掉了。