【问题标题】:Constructor initialization list with empty initialization具有空初始化的构造函数初始化列表
【发布时间】:2012-06-22 21:29:37
【问题描述】:

下面的_currentHandle()是什么意思?

template<class SpiHandleT>
class SpiHandleIterator : public ISpiHandleIterator<SpiHandleT>
{
public:
    SpiHandleIterator() : _currentHandle()
    {
    }
    ...
protected:
    SpiHandleT _currentHandle;
};

【问题讨论】:

    标签: c++


    【解决方案1】:

    这称为值初始化。来自 C++03 标准,§8.5/7:

    初始化器为空括号集的对象,即 (),应进行值初始化。

    从 §8.5/5 开始:

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

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

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

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

    所以在你的情况下,这取决于SpiHandleT的定义:

    • 如果是标量,则初始化为零
    • 如果它是一个类类型没有用户声明的构造函数,它的子对象将被(递归地)值初始化
    • 如果是类类型带有用户声明的构造函数,它将是默认构造的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多