2015-05-02 2 views
0
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

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

ответ

2

От Оператор-

int test::n=0; 

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

1

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

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

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.

Смежные вопросы