不明白为什么两次调用构造函数

时间:2017-04-27 16:06:36

标签: c++

我是c ++(和编程)的新手,我制作了这段代码:

主:

int main(){
  aircraft_list<planes> plane_list;
  plane_list.add();
}

飞机的构造函数:

planes::planes(){
  //initializing some vars
}

添加():

template <class T> aircraft_list<T>& aircraft_list<T>::add(){
  chain_node<T> *y=new chain_node<T>;
  planes obj;
  y->data=obj;
  y->link=first;
  first=y;
  return *this;
}

aircraft_list的构造函数:

aircraft_list(){
    first=0;
  }

aircraft_list的析构函数:

template <class T> aircraft_list<T>::~aircraft_list(){
  chain_node<T> *next;
  while(first){
    next=first->link;
    delete first;
    first=next;
  }
}

从上一个问题开始,我查看了三个规则并修复了析构函数的问题,但仍然无法理解为什么构造函数被调用两次......当我注释掉时:

planes obj;
y->data=obj;

构造函数被调用一次......它创建的对象会发生什么?

修改

aircraft_list class:

template <class T>
class aircraft_list{
friend class planes;

public:
  aircraft_list(){
    first=0;
  }
  ~aircraft_list();
  int search(const T &x) const;
  aircraft_list<T>& del(const T &x);
  aircraft_list<T>& add();

private:
  chain_node<T> *first;
};

chain_node类:

template <class T> class aircraft_list;
template <class T> class chain_node{

public:
  T data;
  chain_node<T> *link;
};

1 个答案:

答案 0 :(得分:0)

简单地说:你至少有两个飞机物体。

一个在

上定义
  planes obj;

这很容易发现。 另一个有点困难,而且你在这里实际上没有贴上一些代码。

  chain_node<T> *y=new chain_node<T>;

因为你的chain_node有一个类型为T的数据,而T的类型为plane,当你创建一个chain_node,而chain_node在它的结构体上有一个平面时,它也会创建一个新的平面实例。