//static member in classes
#include <iostream>
using namespace std;
class CDummy {
public:
static int n;
CDummy() {n++;};
~CDummy(){n--;};
};
int CDummy::n =0;
int main(){
CDummy a;
CDummy b[5];
CDummy *c = new CDummy;
cout << a.n << endl;
delete c;
cout << CDummy::n << endl;
return 0;
}
结果是7,6。 有人可以帮我解释一下吗? 我不明白这个“CDummy b [5];”。人们从不在C中使用这样的语法,对吧?这是什么? 谢谢!
答案 0 :(得分:2)
CDummy b[5];
这声明了一个包含五个CDummy
个对象的数组。它最终调用CDummy
默认构造函数五次(对于数组中的每个对象一次)。
您创建了七个CDummy
个对象:a
,数组b
中的五个,以及c
指向的对象。 n
的值为7
。然后你销毁一个CDummy
对象(c
指向的对象),n
的值为6
。当CDummy
函数返回时,剩余的六个main
对象在超出范围时会被销毁。
答案 1 :(得分:1)
CDummy b[5]
是一个包含五个CDummy
个对象的数组。 CDummy a
只是CDummy
的单个实例,CDummy c
也是如此。
每次创建CDummy
时,都会调用构造函数。
让我们补充一下:5 + 1 + 1 = 7
。这就是n
最初为7
的原因。删除c
后,n--
已执行,n
成为6
。
答案 2 :(得分:0)
static在这种情况下意味着变量n对于所有CDummy实例都是相同的,在你的情况下a,b和c(在使用new分配对象之后)都共享相同的n。这就是你看到这个价值的原因。
CDummy b [5] - &gt;这声明了一个CDummy数组,在这种情况下是5个CDummys。
答案 3 :(得分:0)
CDummy b[5]
只是一个包含5个CDummy对象的数组。
静态成员意味着无论该类的实例有多少,该成员只有一个实例。
每当初始化新实例时,类只是从构造函数中递增n,并且每当实例被销毁时,都会从析构函数中递减n。它基本上跟踪此类当前活动的实例数。
答案 4 :(得分:0)
n
是类CDummy
中的静态成员变量。 n与类的所有对象相关联,而不是与类的每个对象实例相关联。
随着每个对象实例的创建和递减,n
会递增,因为每个对象实例都会被销毁。
在main函数中,我们创建对象a(n = 1),然后是大小为5(n = 6)的对象数组b,后跟指向对象c(n = 7)的指针。所以第一个cout
语句输出7.当c指向的对象被销毁时,n减少到6。
所以第二个cout
语句输出6。
有关类中静态成员的详细信息,请参阅此link