我已经定义了以下结构及其默认构造函数:
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);
}
我不确定这里会发生什么。
答案 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体运行之前使用。