首页 文章

为什么析构函数不会以相反的顺序调用对象数组?

提问于
浏览
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 回答

  • 2

    它以相反的顺序调用 . 你正在打印变量c . 看看我在这个节目中的评论 - “我在这里改变了” . 您正在打印一个计数变量,您应该打印正在销毁的对象 .

    你可以在这里阅读更多: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;
    }
    
  • 1

    他们是,你的测试错误 . 在调用析构函数时,您正在访问自己设置的数字 . 更改析构函数输出以显示类中的实际值,您将自己查看

    cout<<"destructor is called for object no :"<<nmbr<<endl;
    
  • 6

    析构函数以构造函数调用的相反顺序调用 .

    您的测试是错误地生成和打印值 .

    试试这段代码,你会看到预期的结果 .

    #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;
    }
    

相关问题