概述
首先我们了解一下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;
}
最后
以上就是酷酷抽屉为你收集整理的C++STL09---深拷贝和浅拷贝的问题的全部内容,希望文章能够帮你解决C++STL09---深拷贝和浅拷贝的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复