复制构造函数,赋值操作符,深浅复制,数组转换成vector数据
2015-12-15 11:49
351 查看
//赋值操作符重载
CExample & CExample::operator = (const CExample& RightSides)
{
nSize=RightSides.nSize; //复制常规成员
char *temp=new char[nSize]; //复制指针指向的内容
memcpy(temp,RightSides.pBuffer,nSize*sizeof(char));
delete []pBuffer; //删除原指针指向内容 (将删除操作放在后面,避免X=X特殊情况下,内容的丢失)
pBuffer=temp; //建立新指向
return *this
}
拷贝构造函数
CExample::CExample(const CExample& RightSides)
{
pBuffer=NULL;
*this=RightSides //调用重载后的"="
}
调用复制构造函数:
1、一个对象以值传递的方式传入函数体
2、一个对象以值传递的方式从函数返回
3、一个对象需要通过另外一个对象进行初始化
深复制与浅复制
1、在构造函数中,要为指针类型的成员,分配专门的空间。以这条规则构建的复制,称作为深复制
2、所谓浅复制,如同上面出现过的构造函数中处理的一样,直接为数据成员赋值即可
浅复制带来的危害
如果类里面有个数据成员是指针类型,构造函数里面直接进行指针复制,如private:
char *cptr;
public:
Test(char *str)
{
strcpy(cptr,str);
}
这里就会出现问题,因为cptr没有分配地址,是野指针,这样是很危险,所以要用深复制
private:
char *cptr;
public:
Test(char *str)
{
cptr=new char[strlen(str)+1];
strcpy(cptr,str);
}
int a[]={1,2,3,4,5,6};
vector<int> value(a,a+6);
CExample & CExample::operator = (const CExample& RightSides)
{
nSize=RightSides.nSize; //复制常规成员
char *temp=new char[nSize]; //复制指针指向的内容
memcpy(temp,RightSides.pBuffer,nSize*sizeof(char));
delete []pBuffer; //删除原指针指向内容 (将删除操作放在后面,避免X=X特殊情况下,内容的丢失)
pBuffer=temp; //建立新指向
return *this
}
拷贝构造函数
CExample::CExample(const CExample& RightSides)
{
pBuffer=NULL;
*this=RightSides //调用重载后的"="
}
调用复制构造函数:
1、一个对象以值传递的方式传入函数体
2、一个对象以值传递的方式从函数返回
3、一个对象需要通过另外一个对象进行初始化
深复制与浅复制
1、在构造函数中,要为指针类型的成员,分配专门的空间。以这条规则构建的复制,称作为深复制
2、所谓浅复制,如同上面出现过的构造函数中处理的一样,直接为数据成员赋值即可
浅复制带来的危害
如果类里面有个数据成员是指针类型,构造函数里面直接进行指针复制,如private:
char *cptr;
public:
Test(char *str)
{
strcpy(cptr,str);
}
这里就会出现问题,因为cptr没有分配地址,是野指针,这样是很危险,所以要用深复制
private:
char *cptr;
public:
Test(char *str)
{
cptr=new char[strlen(str)+1];
strcpy(cptr,str);
}
int a[]={1,2,3,4,5,6};
vector<int> value(a,a+6);
相关文章推荐
- STL中的binary_search upper_bounde lower_bound
- 命名空间比较好的博客
- 指针和引用的区别
- C++Exception知识整理
- C++String知识整理
- SIP协议详解&eXosip源码库用法分析
- 个人学习c++的经验!
- C++ iterator知识整理
- C++11: unordered_map
- C/C++语言之由数字26引起的文件的数据保存与读取调试。
- Socket通信总结(附C++实现)
- C++函数参数中的省略号用法分析
- C++之异常处理
- 关于运算符重载作为友元函数在VC++6.0中编译出错的两种解决方案
- C++文件读写详解(ofstream,ifstream,fstream)
- 快速识别汇编中等价的C语言语句(if, while, for, switch)
- C++经典面试题
- __thread关键字
- stl遍历与c++11遍历
- C++11 学习笔记 右值引用