c++;作为参数传递的浮点未正确打印 我对C++很陌生。我有一个简单的控制台应用程序,它有一个header.h,用来保存我的类 class MyClass { public: float x, y, z; MyClass(float x, float y, float z); };

c++;作为参数传递的浮点未正确打印 我对C++很陌生。我有一个简单的控制台应用程序,它有一个header.h,用来保存我的类 class MyClass { public: float x, y, z; MyClass(float x, float y, float z); };,c++,C++,我有一个implement.cpp和我所有的实现方法,我有 MyClass::MyClass(float x, float y, float z) {}; 然后在main.cpp中,我尝试简单地打印值 int main() { MyClass One(-3.0f, 0.0f, 4.0f); cout << "Firsth Object: " << One.x << ", " << One.y << ", " <<

我有一个
implement.cpp
和我所有的实现方法,我有

MyClass::MyClass(float x, float y, float z) {};
然后在
main.cpp
中,我尝试简单地打印值

int main()
{
  MyClass One(-3.0f, 0.0f, 4.0f);

  cout <<  "Firsth Object: " << One.x << ", " << One.y << ", " << One.z << endl;
}
intmain()
{
MyClass 1(-3.0华氏度、0.0华氏度、4.0华氏度);

您的构造函数没有初始化任何成员:
MyClass::x
MyClass::y
MyClass::z

你必须做到:

MyClass::MyClass(float x, float y, float z)
{
    this->x = x;
    this->y = y;
    this->z = z;
};
或者更好(更地道,可能更快):


如果没有这些,您将打印
MyClass
对象
One
的未初始化成员的值。通常,您必须在使用它们之前执行此操作。

您当前的构造函数不会执行任何操作

您必须初始化对象变量。为此,您可以使用

MyClass::MyClass(float x, float y, float z) : x(x), y(y), z(z) 
{
}
构造函数中的这种类型的初始化称为初始值设定项列表,您可以读取它


这与@jpo38所指出的构造函数具有相同的效果。

构造函数的用途是什么?您不应该将文件称为“header.h”和“implement.cpp”,而应该称为“MyClass.h”和“MyClass.cpp”@MarkusWeninger:只有在选择类和头/源对的一对一映射时才是这样,但情况并非总是如此。@LightnessRacesinOrbit您是对的,但在这种情况下,头和实现之间存在1:1映射,我更喜欢使用相同的文件名。@MarkusWeninger:您不知道必须使用1:1映射将MyClass::MyClass(浮点x,浮点y,浮点z){};转换为MyClass::MyClass(浮点x,浮点y,浮点z):x(x),y(y),z(z){};非常感谢。正如我所说,我真的是一个初学者。这->是什么意思?仅供参考,您不需要为初始值设定项列表中的参数使用不同的名称,并且标准规范保留以
\u
开头的变量。不必使用
\u
前缀重命名参数,编译器在这个例子将不同的类成员和函数参数区分开来。嗯,对不起,我只是在你的答案上加上了相同的变量名。我同意Galik和Victor的观点,这完全没有必要,而且会损害可读性。但是如果你坚持要弄乱名称,为什么不弄乱私有成员,而不是形式参数呢?这个答案是重复的另一个只有一点修改。只需在
jpo38
的答案中添加一条注释是值得的。好的,那么我应该删除这个答案吗?我对在上面写ansers非常陌生。我认为是的,因为人们通常应该添加有显著差异的答案。如果你只是对另一个答案进行了修改,那么只需添加一条注释即可它,没有必要重复答案。但我认为这有很大的区别,因为大多数其他语言都没有类似于初始值设定项列表的结构。我来自C#和Java,对这样的事情可能发生感到惊讶。@VictorPolevoy:这是一个显著的区别。
MyClass::MyClass(float x, float y, float z) : x(x), y(y), z(z) 
{
}