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, откуда?
Из заявления-
int test::n=0;
‘::
называется оператором разрешения области видимости. Этот оператор используется здесь для инициализации статического поля n, а не класса
Статические данные-члены объявляются в классе. Они определены вне класса.
Таким образом, в определении класса
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.