构造函数静态关键字的使用

Constructors static keyword use

我看了那么多关键词'static'的定义,还是觉得很乱。这个程序的输出应该是:

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;

对于你的例子,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 运行s,它首先构造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 函数中,静态局部变量毫无意义。

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

视情况而定,在大多数情况下,我总是使用静态来计算特定class实例化了多少对象。