构造函数静态关键字的使用
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实例化了多少对象。
我看了那么多关键词'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实例化了多少对象。