C++STL09---深拷贝和浅拷贝的问题

首先我们了解一下STL里面的容器共性机制:

STL容器共性机制

STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素在另行拷贝一份放入到容器中,而不是将原数据直接放入到容器中,也就是说我们提供的元素必须能够被拷贝(自己写的指针的话,就需要自己写一个拷贝构造函数)。

    1.除了Queue和Stack之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素

    2.通常STL不会抛出异常,需要使用传入正确的参数

    3.每个容器都提供了一个默认的构造函数和默认的拷贝构造函数

    4.大小相关的构造方法:1.size()返回容器中元素的个数  2.empty()判断容器是否为空。

 

在这里我还是有点疑问,以下代码中在vs中编译的,还未解决,先放在这里,后续在来更新。

#include<iostream>
#include<vector>
using namespace std;

//深拷贝和浅拷贝的问题
#if 0
class Person
{
public:
	Person(const char* name,int age)
	{
		this->pName = new char[strlen(name) + 1];		//开辟内存
		strcpy(this->pName, name);						//值拷贝
		this->pAge = age;
	}

	//只写上面的会出现程序宕掉,原因是出现了两次析构
	//解决办法,写一个拷贝构造
	Person(const Person& p)
	{
		this->pName = new char[strlen(p.pName) + 1];
		strcpy(this->pName, p.pName);
		this->pAge = p.pAge;
	}
	//重载等号
	Person& operator=(const Person& p)
	{
		//先释放空间,然后在拷贝
		if (this->pName != NULL)
		{
			delete[] this->pName;
		}

		this->pName = new char[strlen(p.pName) + 1];
		strcpy(this->pName, p.pName);
		this->pAge = p.pAge;

		return *this;
	}
	~Person()
	{
		if (this->pName != NULL)
		{
			delete[] this->pName;
		}
	}
public:
	char* pName;			//指针
	int pAge;
};

void test01()
{
	Person p("aaa", 21);
	vector<Person> vPerson;
	vPerson.push_back(p);
}

#endif

class Person2
{
public:
	Person2(char* s)
	{
		pStr = s;
	}
	Person2() {}
	/*Person2& operator=(const Person2 p)
	{
		pStr = p.pStr;
		return *this;
	}*/
	Person2& operator=(const Person2& p)
	{
		if (strlen(pStr) != strlen(p.pStr))
			pStr = new char[strlen(p.pStr) + 1]; //为被赋值对象申请了一个新的内存
		/*if (*this != p)
			strcmp(p.pStr, p.pStr);*/
		return *this;
	}
public:
	char* pStr;
};

void test02()
{
	Person2 p2("aaa"),p3;     //上面不加const这里报错,加了const后上面的=报错
	p3 = p2;
	cout << p2.pStr << endl;
	cout << p3.pStr << endl;
}

int main()
{
	//test01();
	test02();

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到了C++中的深拷贝浅拷贝的概念。深拷贝是指当一个对象被拷贝到另一个对象时,会创建一个新的独立的副本,两个对象之间没有任何关联,改变其中一个对象不会影响另一个对象。而浅拷贝则是指当一个对象被拷贝到另一个对象时,只是简单地复制指针,两个对象会指向同一块内存地址,改变其中一个对象会影响另一个对象。在引用中的map示例中,map是C++中的关联容器,它存储一组键值对,可以通过键来快速查找对应的值。在这个示例中,map对象m1通过赋值和插入操作来添加键值对。当使用赋值操作或插入操作时,map会进行深拷贝,即创建一个新的键值对并存储在map中。所以在这个示例中,map的深拷贝是通过赋值和插入操作来实现的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CC++中深浅拷贝(map、vector)与内存释放](https://blog.csdn.net/m0_67401055/article/details/126326538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++ STL快速入门](https://blog.csdn.net/weixin_34244102/article/details/85897997)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值