21xrx.com
2024-12-22 20:45:33 Sunday
登录
文章检索 我的文章 写文章
C++构造函数和析构函数输出顺序问题探讨
2023-07-14 19:05:12 深夜i     --     --
C++ 构造函数 析构函数 输出顺序 问题探讨

在C++中,构造函数和析构函数是用于处理类对象初始化和销毁的函数。在使用时,很多人可能会对它们的输出顺序产生疑问。

首先,让我们来了解一下什么是构造函数和析构函数。构造函数是在对象创建时自动执行的函数,用于对类的成员变量进行初始化。而析构函数则是在对象被销毁时自动调用的函数,用于释放类的成员变量占用的空间,进行善后工作。

在C++中,构造函数和析构函数的调用顺序与对象的创建和销毁顺序有关。当创建对象时,构造函数会被调用;当销毁对象时,析构函数会被调用。因此,如果我们在创建多个对象的时候,就需要注意它们的创建顺序和析构顺序。

在C++中,对象的创建顺序与它们在代码中出现的顺序有关。也就是说,先创建的对象先调用构造函数,后创建的对象后调用构造函数。例如:


class Example {

public:

  Example()

    cout << "构造函数被调用" << endl;

  

  ~Example()

    cout << "析构函数被调用" << endl;

  

};

int main()

  Example ex1;

  Example ex2;

  return 0;

在上述代码中,先创建的对象ex1调用构造函数,后创建的对象ex2再调用构造函数。因此,输出顺序为:


构造函数被调用

构造函数被调用

同样地,析构顺序也与创建顺序相反。也就是说,后创建的对象先调用析构函数,先创建的对象后调用析构函数。例如:


class Example {

public:

  Example()

    cout << "构造函数被调用" << endl;

  

  ~Example()

    cout << "析构函数被调用" << endl;

  

};

int main()

  Example ex1;

  Example ex2;

  return 0;

在上述代码中,后创建的对象ex2先调用析构函数,先创建的对象ex1后调用析构函数。因此,输出顺序为:


构造函数被调用

构造函数被调用

析构函数被调用

析构函数被调用

需要注意的是,以上规律只适用于局部变量。如果对象是动态分配的,则析构顺序就与创建顺序无关。例如:


class Example {

public:

  Example()

    cout << "构造函数被调用" << endl;

  

  ~Example()

    cout << "析构函数被调用" << endl;

  

};

int main() {

  Example* pEx1 = new Example();

  Example* pEx2 = new Example();

  delete pEx1;

  delete pEx2;

  return 0;

}

在上述代码中,我们动态分配了两个对象pEx1和pEx2。由于它们是在不同的内存地址上分配的,因此析构顺序与创建顺序无关。输出顺序为:


构造函数被调用

构造函数被调用

析构函数被调用

析构函数被调用

综上所述,在C++中,构造函数和析构函数的输出顺序与对象的创建和销毁顺序有关。需要注意的是,以上规律只适用于局部变量。如果对象是动态分配的,则析构顺序就与创建顺序无关。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复