Объявление класса как целого

class test {
public:
static int n;
test () { n++; };
~test () { n--; };
};

int test::n=0; //<----what is this step called? how can a class be declared as an integer?

int main () {
test a;
test b[5]; // I'm not sure what is going on here..is it an array?
test * c = new test;
cout << a.n << endl;
delete c;
cout << test::n << endl;
}

во-вторых, выход 7,6 я не понимаю как он получил 7, откуда?

0

Решение

Из заявления-

int test::n=0;

::называется оператором разрешения области видимости. Этот оператор используется здесь для инициализации статического поля n, а не класса

2

Другие решения

Статические данные-члены объявляются в классе. Они определены вне класса.

Таким образом, в определении класса

class test {

public:
static int n;
test () { n++; };
~test () { n--; };
};

запись

static int n;

только заявляет. Вы должны определить его, то есть выделить для него память.
И это

int test::n=0;

это его определение. test::n является квалифицированным именем переменной, которая обозначает, что n принадлежит классу test.

Согласно определению класса, когда создается объект класса, эта статическая переменная увеличивается

test () { n++; };

И когда объект разрушен, эта статическая переменная уменьшается

~test () { n--; };

Фактически эта статическая переменная играет роль подсчета живых объектов класса.

Таким образом, в main вы определили объект класса с именем a

test a;

Каждый раз, когда объект определен, вызывается конструктор класса. Следовательно, n увеличилось и стало равным 1.
Adter, определяющий массив из 5 объектов

test b[5];

n становится равным 6.

После динамического выделения еще одного объекта

test * c = new test;

n становится равным 7.

После явного удаления

delete c;

n снова становится равным 6, потому что вызванный деструктор уменьшился n.

1