#include <iostream>
#include <vector>
#include "string.h"
using namespace std;
class Stu
{
public:
Stu();
Stu(char *name, int age);
~Stu();
Stu(const Stu& stu);
void ShowInfo();
private:
int age;
char *name;
};
Stu::Stu()
{
age = 0;
this->name = NULL;
}
Stu::Stu(char *name, int age)
{
cout <<name<< "构造函数执行" << endl;
this->name = new char[strlen(name) + 1] ;
strcpy_s(this->name, strlen(name) + 1, name);
this->age = age;
}
Stu::~Stu()
{
cout << this->name << "析构函数执行"<<endl;
delete []this->name;
}
Stu::Stu(const Stu & stu)//自定义拷贝构造函数
{
this->name = new char[strlen(stu.name) + 1];
strcpy_s(this->name, strlen(stu.name) + 1,stu.name);
this->age = stu.age;
cout << stu.name << "To" << this->name << "拷贝构造执行" << endl;
}
void Stu::ShowInfo()
{
cout << "name: " << this->name << " ";
cout << "age: " << this->age << endl;
}
int main()
{
Stu s1("First", 21),s2("Second",22),s3("third",23),s4("fouth",24);
vector <Stu> v1;
v1.push_back(s1);
v1.push_back(s2);
v1.push_back(s3);
v1.push_back(s4);
for (vector<Stu>::iterator it = v1.begin(); it != v1.end(); it++)
{
it->ShowInfo();
}
}
之前出现的问题:1:没有自定义拷贝函数的时候 如果 使用Push_Back() 程序会奔溃
2:程序运行时构造拷贝的个数有些奇怪
运行界面:
结果1:因为Push_Back()一个元素进去Vector里面,就相当于拷贝一个元素进去。涉及到拷贝,如果类中含有指针变量的话就必须用到深拷贝来new一块内存。
如果使用默认拷贝,在拷贝了不同对象后 ,原对象与新对象指向的都是同一块地址,所以在连续两次析构之后,就会连续两次delete同一块内存,导致程序运行奔溃。
关于拷贝的另外几点:
1;为什么用引用
因为初始化时 如果不用引用 相当于临时性的形参拷贝传过来的实参 那再形参的拷贝函数里 又是形参拷贝实参 形成了一个死循环 所以需要用引用
2:const的问题
主要是为了给程序员一个限制 告诉程序员这个变量时只读的
因为复制构造函数是用引用方式传递复制对象,引用方式传递的是地址,因此在构造函数内对该引用的修改会影响源对象。而你在用对象a1构造a2时,自然不希望复制构造函数会改变a1的内容,因此要防止复制构造函数内部修改该引用,所以用const声明。
结果2:
Vector
往vector里面放入类对象的时候 如果对象中有用到指针变量 需要用到深拷贝
重新申请一块内存 Stu::Stu(const Stu & stu) 这就是自定义拷贝
Vector在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。
所以是Vetor不断地Push_Back()的时候,就会不断地重新申请新空间,然后原空间的元素拷过去,然后再析构原空间的对象。