c++模板构造函数初始化
c++ template constructor initialization
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
也可以?
这不是"构造函数初始化",这是一个默认参数。它允许调用者提供比函数更少的参数,未指定的参数将采用默认值。
另一种方法是:
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
参数。
这与构造函数无关;你看到的是默认函数参数和值初始化的组合。
后者在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:
如果对象的初始化式是一组空圆括号,即(),则应该进行值初始化。
相关文章:
- 为什么std::vector和std::valarray初始化构造函数不同
- 初始化构造函数C++中结构的向量
- C++ 中常量属性的初始化构造函数错误
- 不正确的输出和变量未用Eclipse CDT初始化构造函数
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 如何通过参数初始化构造函数中的数组?
- 是否有理由使用 malloc 初始化构造函数中的指针
- 如何在 c++ 中初始化构造函数中的二维数组
- 为什么初始化构造函数列表参数时会发生异常?
- 无法初始化构造函数
- 初始化构造函数的默认参数的优选方法是什么?
- 在C++17中使用空列表初始化构造函数时发生编译错误
- C++ 初始化构造函数初始化列表中的嵌套结构?
- 初始化构造函数c++中的向量
- g++ (GCC) 4.6.0 我有以下类,我正在尝试初始化构造函数的结构成员初始化列表
- 使用字符串文本初始化构造函数中的 std::array<char,x> 成员。海湾合作委员会错误?
- 初始化构造函数C++中函数的成员指针
- 在c++中初始化构造函数中的静态成员变量时出错
- memset()初始化构造函数中的对象
- 初始化构造函数C++中的成员向量