【问题标题】:Initialization of a C++ Struct with a user defined constructor使用用户定义的构造函数初始化 C++ 结构
【发布时间】:2017-11-18 09:31:14
【问题描述】:

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

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和Colour(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);
  }

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

【问题讨论】:

  • 你的第一个版本编译了吗?
  • 它确实可以编译!
  • 不需要显式初始化默认有值的变量。在您的第二个代码中,sn-p 成员将被初始化两次。
  • 东西不能被初始化两次。
  • 对不起,我的意思是会创建两个 Color 类的实例,等等

标签: c++ struct constructor initialization


【解决方案1】:

在 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;
};

如果您编写代码在构造函数的主体中设置类成员,它们将被设置两次。一次在结构的构造函数通过成员的默认构造函数执行之前,然后在您在结构的 ctor 主体中设置它们的值时再次执行。 int 或其他原始类型没有默认构造函数,因此在 struct ctor 主体中的代码设置它之前它会被取消初始化。但是像 std::unique_ptr 这样的对象会被设置两次,因为它确实有一个默认的 CTOR,可以在 struct ctor body 运行之前使用。

【讨论】:

    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2019-03-30
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多