c ++模板构造函数初始化

时间:2011-04-06 00:57:19

标签: c++

template<class T>
class Node
{
    public:
    Node(Node<T>* next=NULL, T data=T()) : _next(next), _data(data)
    {
    } 
    Node<T>* _next;
    T _data;
};

我是c ++模板的新手。对于默认参数,T data = T()是标准方法吗?也许T data = 0也可以吗?

2 个答案:

答案 0 :(得分:7)

那不是“构造函数初始化”,这是一个默认参数。它允许调用者提供的参数少于函数所具有的参数,未指定的参数将采用默认值。

另一种方法是:

template<class T>
class Node
{
    public:
    Node(Node<T>* next, T data) : m_next(next), m_data(data) {} 
    Node(Node<T>* next) : m_next(next), m_data() {} 
    Node(void) : m_next(NULL), m_data() {} 

    Node<T>* m_next;
    T m_data;
};

还允许使用少于两个参数,但调用不同的构造函数(几乎具有相同的行为)。

使用单独的重载有很多好处:

  • 如果始终省略data参数,则不需要复制构造函数。
  • 如果始终提供data参数,则不需要默认构造函数。

答案 1 :(得分:3)

这与构造函数无关;您所看到的是默认函数参数和值初始化的组合。

后者在C ++ 03标准§8.5/ 5中描述:

  

对T类型的对象进行值初始化意味着:

     
      
  • 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
  •   
  • 如果T是没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;
  •   
  • 如果T是数组类型,则每个元素都是值初始化的;
  •   
  • 否则,对象为零初始化
  •   

  

零初始化T类型的对象意味着:

     
      
  • 如果T是标量类型(3.9),则将对象设置为0(零)转换为T的值;
  •   
  • 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的;
  •   
  • 如果T是联合类型,则对象的第一个命名数据成员89)是零初始化的;
  •   
  • 如果T是数组类型,则每个元素都是零初始化的;
  •   
  • 如果T是引用类型,则不执行初始化。
  •   

最后,将它拼凑在一起,§8.5/ 7:

  

一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。