Статические элементы данных объявляются в классе. Они определены вне класса.
Таким образом, в определении класса
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--; };
На самом деле этого статическая переменная играет роль подсчета живых объектов класса.
Таким образом, в основной вы определили объект класса с именем
test a;
Каждый раз, когда объект определен конструктор класса называется. Следовательно, п была увеличена и становится равным 1. Adter, определяющего массив 5 объектов
test b[5];
п становится равным 6.
После того, как динамическое выделение более одного объекта
test * c = new test;
п становится равным до 7.
После его явного удаления
delete c;
n снова становится равным 6, потому что названный деструктор уменьшен n.
https://www.google.com/search?q=c%2B%2B+static+member+initialization&ie=utf-8&oe=utf-8&aq=t&rls=Palemoon:en-US&client=palemoon – user3528438