T指针默认值

时间:2018-01-30 17:55:52

标签: c++

RDLC Report

如果template <typename T> class myclass { public: myclass(); private: T value; }; template <typename T> myclass<T>::myclass() : value(T()) {} 是指针(例如T),那么默认值(int*)是多少?是int*()还是纯零?这种情况有什么不同吗?

3 个答案:

答案 0 :(得分:4)

  

那么默认值是多少?是nullptr还是普通零?

然后指针是空指针。在这种情况下,nullptr0可以互换。

答案 1 :(得分:2)

  

nullptr还是纯零?这种情况有什么不同吗?

您正在使用的初始化语法称为value initialization。对于指针,它与zero initialization相同。因此,当Tint*时,您的代码等同于

template <typename T>
myclass<T>::myclass() : value(T(0)) {}
  

这种情况有什么不同吗?

不,没有。

答案 2 :(得分:1)

Per cppreference.com:

Value Initialization

  

语法

     

T();(1)
  ...

     

在以下情况下执行值初始化:

     

1,5)创建无名临时对象时,初始化程序由一对空括号[或大括号(自C ++ 11)]组成];
  ...

     

值初始化的影响是:

     

1)如果T是具有至少一个用户提供的任何类型构造函数的类类型,则调用默认构造函数; (直到C ++ 11)

     

1)如果T是没有默认构造函数的类类型,或者是用户提供或删除的默认构造函数,则该对象是默认初始化的; (自C ++ 11起)

           

2)如果T是不带任何用户提供的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的; (直到C ++ 11)

     

2)如果T是具有默认构造函数的类类型,该构造函数既不是用户提供也不是删除(也就是说,它可能是具有隐式定义或默认默认构造函数的类),该对象是零初始化的并且如果它有一个非平凡的默认构造函数,那么它是默认初始化的; (自C ++ 11起)

           

3)如果T是数组类型,则数组的每个元素都是值初始化的;

     

4)否则,该对象为零初始化。

Zero Initialization

  

语法

     

T();(2)
  ...

     

在以下情况下执行零初始化:

     

...
  2)作为非类类型的值初始化序列的一部分,以及没有构造函数的值初始化类类型的成员,包括没有提供初始值设定项的聚合元素的值初始化。
  ...

     

零初始化的影响是:

     
      
  • 如果T是标量类型,则对象的初始值是显式转换为T的整数常量零。

  •   
  • 如果T是非联合类类型,则所有基类和非静态数据成员都是零初始化的,并且所有填充都初始化为零位。构造函数(如果有)将被忽略。

  •   
  • 如果T是并集类型,则第一个非静态命名数据成员将进行零初始化,并将所有填充初始化为零位。

  •   
  • 如果T是数组类型,则每个元素都是零初始化

  •   
  • 如果T是引用类型,则不执行任何操作。

  •   

这意味着当T 任何指针类型(例如:int*)时,T()0转换为{{1} (例如:T)。在C ++ 11及更高版本中,这相当于static_cast<int*>(0),因为文字nullptr可以隐式转换为指针类型,与0相同。