2015-07-06 2 views
0

Деструкторы вызываются в обратном порядке создания объекта в C++, но я не понимаю, почему он не поддерживается для массива объектов.Почему деструкторы не вызываются в обратном порядке для массива объектов?

#include <iostream> 
using namespace std; 
class test { 
    int nmbr; 
    static int c; 
public: 
    test(int j) 
    { 
     cout<<"constructor is called for object no :"<<j<<endl; 
     nmbr=j; 
    }; 
    ~test() 
    { 
     c++; 
     cout<<"destructor is called for object no :"<<c<<endl; 
    }; 
}; 

int test::c=0; 

int main() 
{ 
    test ob[]={test(1),test(2),test(3)}; 
    return 0; 
} 

Приведенные выше результаты программы

constructor is called for object no :1 
constructor is called for object no :2 
constructor is called for object no :3 
destructor is called for object no :1 
destructor is called for object no :2 
destructor is called for object no :3 

Но почему деструкторы не вызываются в обратном порядке?

+3

Попробуйте 'test ob [] = {test (97), test (1043), test (-12)};' и посмотреть, что произойдет. – molbdnilo

+0

или установить тест :: c = 5 или любое случайное число, отличное от 0. вы поймете –

ответ

6

Он вызывается в обратном порядке. Вы печатаете переменную c. Посмотрите мой комментарий в этой программе - «Я изменился здесь». Вы печатали переменную count, в которой вы должны были напечатать объект, который был уничтожен.

Вы можете прочитать здесь: https://isocpp.org/wiki/faq/dtors#order-dtors-for-arrays

#include <iostream> 
using namespace std; 
class test { 
    int nmbr; 
    static int c; 
public: 
    test(int j) 
    { 
     cout<<"constructor is called for object no :"<<j<<endl; 
     nmbr=j; 
    }; 
    ~test() 
    { 
     c++; 
     // I changed here 
     cout<<"destructor is called for object no :"<<nmbr<<endl; 
    }; 
}; 

int test::c=0; 

int main() 
{ 
    test ob[]={test(1),test(2),test(3)}; 
    return 0; 
} 
+0

Глупая ошибка. Спасибо, теперь я должен удалить это сообщение, так как есть очень мало вероятность, что этот вопрос поможет кому-нибудь в будущем? –

2

Они, ошибка с тестом. При вызове деструктора вы получаете доступ к числу, которое вы настраиваете сами. Изменение выходного сигнала деструктор, чтобы показать фактическое значение в классе, и вы увидите сами

cout<<"destructor is called for object no :"<<nmbr<<endl; 
+0

Вы только что скопировали этот код другого ответа? –

+1

Нет, письмо в то же время, бывает. Не вижу причин для понижения для этого – Modred

1

деструкторы вызываются в обратном порядке вызова конструктора.

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

Попробуйте этот код, и вы увидите ожидаемые результаты.

#include <iostream> 

class test { 
    int this_instance; 
    static int number_of_instances; 
public: 
    test() : this_instance(number_of_instances++) 
    { 
     std::cout << "constructor invoked for object :"<< this_instance << '\n'; 
    }; 
    ~test() 
    { 
     std::cout << "destructor invoked for object :" << this_instance << '\n'; 
    }; 
}; 

int test::number_of_instances = 0; 

int main() 
{ 
    test first_batch[4]; 

    return 0; 
} 
Смежные вопросы