STL的深浅拷贝问题
STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
usingnamespace std;
class myclass{
public:
myclass(char* data){
int len = strlen(data) + 1; //计算传进来的字符串长度
this->data =newchar[len]; //在堆区分配了len字节内存
strcpy(this->data, data); //将数据拷贝到我们在堆分配的内存中
}
//增加拷贝构造函数
myclass(const myclass& mc){
int len = strlen(mc.data) + 1;
this->data =newchar[len];
strcpy(this->data, mc.data);
}
//重载operator=操作符
myclass& operator=(const myclass& mc){
if (this->data != NULL){
delete[] this->data;
this->data = NULL;
}
int len = strlen(mc.data) + 1;
this->data =newchar[len];
strcpy(this->data, mc.data);
return*this;
}
//既然我们在堆区分配了内存,需要在析构函数中释放内存
~myclass(){
if(NULL!=this->data){
delete[]this->data;
this->data =NULL;
}
}
private:
char* data;
};
void test_deep_copy(){
char* data ="abcd";
myclass mc(data); //创建myclass的实例 并用char*字符串data初始化对象
vector<myclass> v; //创建vector容器
v.push_back(mc); //将mc实例插入到vector容器尾部
}
int main(){
test_deep_copy();//调用测试函数
return0;
}
1.把对象放入容器,其实是拷贝一份对象到容器。
2.注意:
1.拷贝构造要能被调用
2.注意要浅拷贝问题