Vector,深拷贝问题

对于里面的变量age,由于不存在new的操作,浅拷贝遍完事了,对于name,由于存在new的操作,需要手动添加拷贝构造函数来
实现深拷贝。否则程序会出现问题。
vector会对push_back进来的变量进行自动的拷贝构造,和自动的调用析构函数,所以在使用的
过程中需要自己写析构函数,但是不用手动调用析构函数了。

class Teacher{
public:
  Teacher(char* name,int age)
{

    int len = strlen(name) + 1;
    this->name = new char[len]; //在堆分配内存
    strcpy(this->name,name);

    this->age = age;
    cout<<"普通构造函数"<<endl;
}


//拷贝构造 如果没有这个程序容易崩溃
Teacher(const Teacher& t)
{
    int len = strlen(t.name) + 1;
    this->name = new char[len];
    strcpy(this->name, t.name);

    this->age = t.age;
    cout<<"拷贝构造函数"<<endl;
}

//重载=
Teacher& operator=(const Teacher& t)
{

    int len = strlen(t.name) + 1;
    if (this->name != NULL){
    delete[] this->name;
}
  this->name = new char[len];
  strcpy(this->name, t.name);

  this->age = t.age;
  cout<<"=重载"<<endl;
  return *this;
}

~Teacher()
{
  if (this->name != NULL)
  {
    delete[] this->name;
  }
  this->age = 0;
  cout<<"Teacher()析构函数"<<endl;
}


  char* name;
  int age;
};


//测试函数 深拷贝和浅拷贝 程序在执行完test 会释放掉 会调用析构函数
void test01()
{

  Teacher t1("aaa",20);
  vector<Teacher> v;
  v.push_back(t1);
  cout<<v[0].name<<endl;
  v.clear();
}


int main()

{


  test01();


  return EXIT_SUCCESS;
}

在调用push_back过程中,发现调用了一次构造函数,和二次拷贝构造函数,二次拷贝构造函数是在
push_back中发生的,具体内部实现不过分纠结。
结论:对于需要new操作的对象,还是需要手动编写拷贝构造函数的,和析构函数。之后
进入vector中的变量遍不需要自己担心了,交给vector就好。

猜你喜欢

转载自www.cnblogs.com/yuzhiboprogram/p/9988710.html
今日推荐