奇怪的c ++代码片段

时间:2011-05-10 12:39:42

标签: c++

我有这个片段:

template<class T>
class VECTOR_2D 
{
public:
    T x,y;

    VECTOR_2D() 
        :x(T()),y(T())
    {}
}

在构造函数中初始化的x和y是什么?

4 个答案:

答案 0 :(得分:6)

xy 复制初始化T值初始化值。

来自C ++ 03标准,§8.5/ 7:

  

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

来自§8.5/ 5:

  

value-initialize T类型的对象意味着:

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

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

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

x(T()),y(T())可以替换为x(),y(),而是直接初始化xy。在大多数情况下,这将实现相同的净效果(假设T是可复制的),但在某些情况下,这将更有效,因此作为一般规则,这种方法应始终是首选。

答案 1 :(得分:3)

T的实例(每个),由该类型的default constructor构建。

答案 2 :(得分:2)

有人没有意识到您可以像这样默认初始化:

VECTOR_2D() : x(), y() {};

所以,相反,他们通过做一些类似这样的事情,真的很啰嗦

X x = X();

无意义的副本应该由任何理智的编译器优化,但它仍然有点愚蠢。

答案 3 :(得分:1)

在表达式中使用T()会创建一个类型为T值初始化的右值。

如果T有一个默认构造函数,将调用构造函数,如果T是聚合类型,则每个属性将值初始化,对于< em> primitive 类型(在Java意义上使用 primitive :integer,float,double,char,pointers),它们将被设置为0.