C++ 它在构造函数声明中是什么意思
可能重复: 我找到了这段代码,它是Vector3f类的构造函数C++ 它在构造函数声明中是什么意思,c++,C++,可能重复: 我找到了这段代码,它是Vector3f类的构造函数 Vector3f::Vector3f() : x(0) , y(0) , z(0) { } 这个定义:x0,y0,z0是什么意思?我该如何使用它?这称为类初始化器列表。必须有3个成员变量,x y z,并且它正在将它们全部设置为0 退房 类初始化列表很整洁,因为它们允许您在构造函数中的代码执行之前设置类状态的初始值。这与仅在构造函数中赋值不同,并使许多事情成为可能: 它们允许您为常量成员赋值 它们是将值传
Vector3f::Vector3f()
: x(0)
, y(0)
, z(0)
{
}
这个定义:x0,y0,z0是什么意思?我该如何使用它?这称为类初始化器列表。必须有3个成员变量,x y z,并且它正在将它们全部设置为0 退房 类初始化列表很整洁,因为它们允许您在构造函数中的代码执行之前设置类状态的初始值。这与仅在构造函数中赋值不同,并使许多事情成为可能: 它们允许您为常量成员赋值 它们是将值传递给父类构造函数的唯一方法 它们是实例化类中基于堆栈的成员对象的唯一方法,这些对象需要向构造函数传递某种值。
这称为类初始化器列表。必须有3个成员变量,x y z,并且它正在将它们全部设置为0 退房 类初始化列表很整洁,因为它们允许您在构造函数中的代码执行之前设置类状态的初始值。这与仅在构造函数中赋值不同,并使许多事情成为可能: 它们允许您为常量成员赋值 它们是将值传递给父类构造函数的唯一方法 它们是实例化类中基于堆栈的成员对象的唯一方法,这些对象需要向构造函数传递某种值。
在C++中被称为初始化列表。 In初始化变量x、y和z
在这种情况下,假设x、y和z为int,则与:x = 0
y = 0
z = 0
正如@Charles Bailey恰当地指出的,如果类型不是int,而是一些自定义的用户定义类,那么赋值和构造可能不是完全等价的
说明:
在初始化列表中,通过调用每个变量上的适当默认构造函数初始化类型,对于int类型的内置数据类型,这与赋值相同,但对于自定义类,构造函数操作可能不同于赋值操作。 在C++中称为初始化列表。 In初始化变量x、y和z
在这种情况下,假设x、y和z为int,则与:x = 0
y = 0
z = 0
正如@Charles Bailey恰当地指出的,如果类型不是int,而是一些自定义的用户定义类,那么赋值和构造可能不是完全等价的
说明:
在初始值设定项列表中,通过对每个变量调用适当的默认构造函数来初始化类型,对于int这样的内置数据类型,这与赋值相同,但对于自定义类,构造函数操作可能不同于赋值操作。对于基元类型,它与
x = 0;
y = 0;
z = 0;
虽然初始化列表和主体内部的赋值之间有细微的区别。当我们通过初始值设定项列表初始化字段时,构造函数将被调用一次。如果我们使用赋值,那么字段将首先用默认构造函数初始化,然后通过赋值运算符用实际值重新赋值。对于基本类型,它与
x = 0;
y = 0;
z = 0;
虽然初始化列表和主体内部的赋值之间有细微的区别。当我们通过初始值设定项列表初始化字段时,构造函数将被调用一次。如果我们使用赋值,那么字段将首先用默认构造函数初始化,然后通过赋值运算符用实际值重新赋值。如果不知道x、y和z的类型,就不能说在这种情况下是相同的。当然,如果它们是例如INT,那么它将具有相同的效果,但它们的类类型可能具有不同的构造和赋值行为,或者它们甚至可能是常量。@Charles Bailey:没错,我只是假设它们是整数,但确实应该澄清一下。我在答案中添加了细节。如果不知道x、y和z的类型,就不能说在这种情况下是相同的。当然,如果它们是例如INT,那么它将具有相同的效果,但它们的类类型可能具有不同的构造和赋值行为,或者它们甚至可能是常量。@Charles Bailey:没错,我只是假设它们是整数,但确实应该澄清一下。我添加了要回答的详细信息。如果没有常见问题解答条目,应该有。看……这里有:@Fred公平地说,它并没有真正解释为什么要使用初始值设定项列表,而有一半是花在解释::operator@Josh我明白你的意思。“有更好的参考吗?”弗雷德承认我对刚才给出的答案有些偏见,是的,这是一个非常好的参考:如果没有常见问题条目,应该有。看……有:@Fred公平地说,它并没有真正解释为什么要使用初始值设定项列表,而有一半的时间花在了解释::运算符上
r@Josh我明白你的意思。是一个更好的参考吗?@Fred承认我对刚才给出的答案有些偏见,是的,这是一个非常好的参考: