往Vector里面Push_Back类对象元素的一些问题

#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()的时候,就会不断地重新申请新空间,然后原空间的元素拷过去,然后再析构原空间的对象。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值