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
也可以吗?
答案 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:
一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。