使用用户定义的构造函数

时间:2017-06-15 19:06:48

标签: c++ struct constructor initialization

我已经定义了以下结构及其默认构造函数:

struct State
{
  State()
  {
     // Initialize both stacks with unit matrices
     objStack.push(Matrix(1, 1, 1, SCALE));
     lightStack.push(Matrix(1, 1, 1, SCALE));
  }

  std::stack<Affine> objStack;
  std::stack<Affine> lightStack;

  int maxDepth = 5;
  std::unique_ptr<Point[]> vertices = nullptr;
  Colour ambient = Colour(0.2);
};

如果在我实例化State结构时执行了我声明的构造函数,那么最后3个变量是否仍然用5,nullptr和Color(0.2)初始化?或者我的构造函数应该是这样的:

  State()
  {
     // Initialize both stacks with unit matrices
     objStack.push(Matrix(1, 1, 1, SCALE));
     lightStack.push(Matrix(1, 1, 1, SCALE));

     maxDepth = 5;
     vertices = nullptr;
     ambient = Colour(0.2);
  }

我不确定这里会发生什么。

1 个答案:

答案 0 :(得分:3)

在C ++ 11或更高版本中,您的第一个示例是正确的。它将初始化类成员作为构造过程的一部分,这将在调用struct State构造函数的主体之前发生。在C ++ 11之前,以这种方式对成员进行的类内初始化是无效的,不会编译。您可以使用初始化列表以不同方式编写以下部分,这会产生与C ++ 11代码相同的行为。

struct State
{
  State() : maxDepth(5), verticies(NULL), ambient(0.2)
  { ...
  }

  int maxDepth;
  std::unique_ptr<Point[]> vertices;
  Colour ambient;
};

如果编写代码来在构造函数的主体中设置类成员,则会将它们设置为两次。一旦结构的构造函数通过成员执行之前,就会发生这种情况。默认构造函数,然后再次在结构体中设置它们的值。 int或其他基本类型没有默认构造函数,因此在struct ctor体中的代码设置它之前它将是未初始化的。但像std::unique_ptr这样的对象会被设置两次,因为它确实有一个默认的CTOR,它将在struct ctor体运行之前使用。