为 C++ 中的简单构造函数程序获取异常输出

Getting an unusual output for a simple constructor program in C++

我是 C++ 的新手,在尝试了解构造函数时遇到了异常错误。在这里,我试图让 x = 5 和 y = 6,然后让程序将它们打印到屏幕上。

这是我的程序 ->

#include <iostream>
using namespace std;

class class1 {
    public:
        int x;
        int y;
        class1(int x, int y) {
            x = x;
            y = y;
        }
}




int main() {
class1 class1obj(5, 6);
cout << class1obj.x << endl << class1obj.y;

}

这是我在 3 运行 秒后的输出 ->

第一运行

172691493
1

第 2 运行

126890021
1

第 3 运行

226783269
1

正如您从输出中看到的那样,y 似乎是一个常数“1”,而 x 似乎只是通过随机数不断变化。 这个程序相当简单,所以我不知道这里出了什么问题。

还应该注意的是,我在 mac OS big sur 上,我使用 g++ -std=c++11 作为我的编译器,因为 g++ 似乎并不适用于所有人我的程序(是的,我已经为这个特定程序单独尝试了 g++,但它仍然不起作用)。

非常感谢任何帮助!

这个:

   class1(int x, int y) {
        x = x;
        y = y;
    }

称为阴影。一个变量隐藏另一个同名变量。 x = x 只是将参数 x 的值赋给自己,成员未初始化。编译器无法知道你想让一个 x 成为成员而另一个成为参数,相反,参数被称为“影子”成员,在 x = x;x 是参数。您应该使用不同的名称:

   class1(int a, int b) {
        x = a;
        y = b;
    }

或使用成员初始化列表(无论如何你应该更喜欢):

   class1(int a, int b) : x(a),y(b) {}

关于 x 指的是什么,初始化列表中没有歧义:

   class1(int x, int y) : x(x),y(y) {}

x(x)中,第一个x只能引用成员,第二个x只能引用参数。