【问题标题】:Constructors static keyword use构造函数静态关键字使用
【发布时间】:2021-12-28 00:23:09
【问题描述】:

我阅读了很多关键字“静态”的定义,但我仍然觉得它很混乱。这个程序的输出应该是:

1 2 1 2 3 4 1 1 2 3 4 8 7 6 5 1 2 6 5

我了解全局成员是如何调用的,但是当程序到达 main 和 static D d;我都糊涂了。提前感谢任何愿意解释的人!

#include <iostream>
using namespace std;
struct D {
  D() { cout << "1" << endl; }
  ~D() { cout << "5" << endl; }
};
class C {
public:
  D d;
  C() { cout << "2" << endl; }
  ~C() { cout << "6" << endl; }
};
struct B {
  C c;
  B() { cout << "3" << endl; }
  ~B() { cout << "7" << endl; }
};
struct A {
  B b;
  A() { cout << "4" << endl; }
  ~A() { cout << "8" << endl; }
};
extern A a;
C c;
int main() {
  static D d;
  A{};
  C{};
  return 0;
}
A a;
extern B b;

【问题讨论】:

  • 您的代码中没有全局成员。如果您认为有,那可能是您感到困惑的一个因素。
  • 我对你的困惑感到困惑。你输入了你期望的输出,但是你得到了什么?

标签: c++ struct constructor static output


【解决方案1】:

例如,I'm getting

1 2
1 2 3 4
1
1 2 3 4
8 7 6 5
1 2 6 5
5 8 7 6 5 6 5

我将输出分解为与后面段落相对应的组。

首先构造全局变量C c;。这首先构造其类型为D 的成员变量,它打印1;然后C 的构造函数打印2。这是第一个 1 2 占。

然后,构造了全局变量A a;。即使定义在main 之后,全局变量也是在输入main 之前构造的。这首先构造了B 类型的成员,后者又构造了C 类型的成员,我们已经知道打印1 2。然后B 的构造函数打印3,最后A 的构造函数打印4。这是下一个1 2 3 4 占。

然后main 运行,它首先构造static D d;,它打印1

然后构造临时的A{},我们已经知道打印1 2 3 4。然后这个临时的就被销毁了。析构函数总是以构造的相反顺序运行,因此8 7 6 5

然后临时的C{} 被构造并立即销毁。我们已经知道C 的构造打印1 2 和破坏打印6 5

最后,main 退出,static D d 和两个全局变量以相反的构造顺序被销毁。他们在向上打印了1 2 1 2 3 4 1,所以现在他们在向下打印了5 8 7 6 5 6 5


在此示例中,如果从 static D d; 中删除 static 关键字,则不会发生任何变化。特别是在main 函数中,静态局部变量是毫无意义的。

【讨论】:

  • 解释得很好,非常感谢!
【解决方案2】:

如果没有意义,我通常将变量声明为静态的。我发现静态非常适合我可能涉及计算此类对象的起源的场景。

这取决于情况,在大多数情况下,我总是使用静态来计算特定类的实例化对象的数量。

【讨论】:

  • 这既不能回答问题,也不能理解问题的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2016-07-18
  • 2011-11-05
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多