为什么第二个变量在现场没有变化?

Why does the second variable not change in the field?

我正在为我的讲座测试一些程序。我正在创建 类 并使用参数列表初始化一个字段,但第二个变量没有改变。

#include <iostream>
using namespace std;

class Punkt {

    int x;
    int y;

public:
    Punkt(int a = 0, int b = 0)
    {
        x = a;
        y = b;

    }
    void printXY()
    {
        cout << "x= " << x << " y= " << y << endl;
    }
};

int main() {

    Punkt pFeld[] = { (1, 1), (2, 2), (3, 3) };

    for (int i = 0; i < 3; i++)
        pFeld[i].printXY();
    cin.get();
};

没有错误信息。预期结果是x和y发生变化,而实际结果是只有x发生变化而y保持0。

这个

(1, 1)

是带逗号运算符的表达式。

其实这个初始化

Punkt pFeld[] = { (1, 1), (2, 2), (3, 3) };

相当于

Punkt pFeld[] = { 1, 2, 3 };

所以第二个默认参数等于0的构造函数被调用了三次。

改用

{ 1, 1 }

这是您更新后的代码

#include <iostream>
using namespace std;

class Punkt {

    int x;
    int y;

public:
    Punkt(int a = 0, int b = 0)
    {
        x = a;
        y = b;

    }
    void printXY()
    {
        cout << "x= " << x << " y= " << y << endl;
    }
};

int main() {

    Punkt pFeld[] = { {1, 1}, {2, 2}, {3, 3} };

    for (int i = 0; i < 3; i++)
        pFeld[i].printXY();
    cin.get();
}

它的输出是

x= 1 y= 1
x= 2 y= 2
x= 3 y= 3

注意main函数后面的分号是多余的

(1, 1)传递给Punkt的构造函数,comma operator将return第二个操作数作为结果(第一个操作数被丢弃),所以你'只将一个 int 的值 1 传递给构造函数。这就是为什么 y 总是初始化为 0.

你想要的应该是

Punkt pFeld[] = { {1, 1}, {2, 2}, {3, 3} }; // list initialization since C++11

Punkt pFeld[] = { Punkt(1, 1), Punkt(2, 2), Punkt(3, 3) };