【问题标题】:Why does it print five times 5 instead of 1 2 3 4 5? [closed]为什么它打印五次 5 而不是 1 2 3 4 5? [关闭]
【发布时间】:2019-08-08 14:30:49
【问题描述】:

我很困惑为什么这段代码会打印五次 5 而不是 1 2 3 4 5。 如果我把代码改成T t[4],那么输出就是4的四倍。

#include <iostream>
using namespace std;

class Test
{
    static int x;
public:
    Test() { x++; }
    static int getX() {return x;}
};

int Test::x = 0;

int main()
{

    Test t[5];
    for (auto element : t)
    {
    cout << element.getX() << " ";
    }

    cout << endl;

    return 0;
 }

【问题讨论】:

  • 调试器说什么?
  • 因为有一个变量名为Test::xTests 构造函数被调用 5 次,每次递增 Test::x,结果为 5。然后循环开始,Test::x(仍为5)被打印五次。

标签: c++ arrays object


【解决方案1】:

x 是静态的; Test 的每个实例都看到相同的值。

Test t[5]被声明和初始化时,Test()构造函数被调用了五次;每次调用都会增加一个共享值x。一旦该数组完全初始化,x 就是 5。

当您对每个元素调用 getX() 时,它们都会返回该共享值。如果您希望每个都有自己的值,请递增 x,但将递增后的值分配给非静态成员变量:

class Test
{
    static int y;
    int x;
public:
    Test() { y++; x = y; }
    static int getX() {return x;}
};

【讨论】:

  • 我会使用Test() { x = ++y; } 甚至Test() : x(++y) {},但最终结果都是一样的
  • @RemyLebeau 如果我自己写这篇文章,我也会这样做;我尽可能地保持旧结构(只是额外分配),因为其他读者(尤其是初学者)可能会从尽可能简单明了的更改中受益。
【解决方案2】:

当您将变量声明为静态时:

static int x;

...这意味着您的程序中只有一个该变量的实例,无论您实例化了多少 Test 实例。也就是说,您所有的 Test 对象都引用了单个 x

您可能还想要声明一个单独的(非静态)变量,并从x 设置它:

class Test
{
   static int x;
   int y;

public:
   Test() { y = ++x; }
   int getY() const {return y;}
};

【讨论】:

    【解决方案3】:

    类变量x 是静态的,初始化为零。它递增五次 - 在创建数组 t 时的五个构造函数调用中的每一个中,因此当您的循环运行时,它的值是 5

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多