对于里面的变量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就好。