构造函数和析构函数的顺序

时间:2017-06-09 19:07:34

标签: c++ constructor destructor

这是一段代码:

#include<iostream>
using namespace std;
class cls
{
    int x;
public:
        cls(int i=0) {cout<<" c1 "; x=i;}
        ~cls() {cout<<" d 1 ";}
};
class cls1
{
    int x; cls xx;
public:
        cls1(int i=0){cout<<" c2 ";x=i;}
        ~cls1(){cout<<" d2 ";}
}c;
class cls2
{
    int x;cls1 xx;cls xxx;
public:
    cls2(int i=0) {cout<<" c3 ";x=i;}
    ~cls2(){ cout<<" d3 ";}
};
int main()
{
    cls2 s;
    return 0;
}

输出为c1 c2 c1 c2 c1 c3 d3 d1 d2 d1 d2 d1我不明白为什么。 我需要一些帮助。

1 个答案:

答案 0 :(得分:0)

  

我需要一些帮助。

似乎代码的一个目的是混淆。错误的类名,误导性的实例名称等。

抵制混淆的一个想法是找到并练习编码标准。

以下代码是上面的代码,其中包含了我喜欢的编码标准的简单替换。

看看这个,看看你是否可以创建一些你不理解的问题。

注意 - 代码中不会出现“d1”,但会在输出中显示。因此,您的输出不是您发布的代码。我会认为这是一个简单的错字。

#include <chrono>
// 'compressed' chrono access --------------vvvvvvv
typedef std::chrono::high_resolution_clock  HRClk_t; // std-chrono-hi-res-clk
typedef HRClk_t::time_point                 Time_t;  // std-chrono-hi-res-clk-time-point
typedef std::chrono::microseconds           US_t;    // std-chrono-microseconds
using   namespace std::chrono_literals;          // support suffixes like 100ms, 2s, 30us
// examples:
//
//   Time_t start_us = HRClk_t::now();
//
//   auto  duration_us = std::chrono::duration_cast<US_t>(HRClk_t::now() - start_us);
//   auto     count_us = duration_us.count();
//   or
//   std::cout << "  complete " << duration_us.count() << " us" << std::endl;
#include <iostream>

// classes are types, so suffix with _t
// do not 'using namespace std;

class Foo_t  // was cls
{
   int x;

public:
   Foo_t(int i=0) {std::cout<<"  Foo_t: c1 \n";  x=i;}
   ~Foo_t()       {std::cout<<"  ~Foo_t: d1 \n";}      // typo fixed
};

class Bar_t  // was cls1
{
   int   x;
   Foo_t xx;

public:
   Bar_t(int i=0){std::cout<<"  Bar_t: c2 \n";  x=i;}
   ~Bar_t()      {std::cout<<"  ~Bar_t: d2 \n";}
}  bar;

class Zep_t // was cls2
{
   int     x;
   Bar_t  xx;
   Foo_t xxx;
public:
   Zep_t(int i=0) {std::cout<<"  Zep_t: c3 \n"; x=i;}
   ~Zep_t()       { std::cout<<"  ~Zep_t: d3 \n";}
};

class T490_t
{

public:

   T490_t() = default;
   ~T490_t() = default;

   int exec()
      {
         Zep_t z;
         return(0);
      }

}; // class T490_t


int main(int , char** )
{
   std::cout << "\n  main() start\n" << std::endl;

   Time_t start_us = HRClk_t::now();
   int retVal = -1;
   {
      T490_t   t490;
      retVal = t490.exec();
   }

   auto  duration_us = std::chrono::duration_cast<US_t>(HRClk_t::now() - start_us);
   std::cout << "\n  FINI   " << duration_us.count() << " us\n" << std::endl;
   return(retVal);
}

输出结果为:

  Foo_t: c1 
  Bar_t: c2 

  main() start

  Foo_t: c1 
  Bar_t: c2 
  Foo_t: c1 
  Zep_t: c3 
  ~Zep_t: d3 
  ~Foo_t: d1 
  ~Bar_t: d2 
  ~Foo_t: d1 

  FINI   33 us

  ~Bar_t: d2 
  ~Foo_t: d1 

注意如何在main()之前构造Foo_t和Bar_t。

注意那些2 dtors如何在main之后运行(在FINI之后)。

祝你好运。