注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

C++---什么时候需要重写拷贝构造与赋值拷贝  

2013-12-29 16:43:48|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在自定一个类时,有时需要重写拷贝构造或/与赋值拷贝;
如:
class   A 
{
public:
A();
~A();
      A(const A& a)   //拷贝构造;---创建了一个新的对象,此新的对象与a对象中的值相同,但地址不会一样;
{
if(m_num)
delete m_num;
m_num = new int;
//下面将a.m_num的值赋值给m_num,注意不是指针....
....
}
    A&  operator=(const A& a)  //赋值构造,此时左值(即接受数据的对象)地址不变,只是内容变化了,与a对象的值一样。
{
if(&a==this)
return *this;
if(m_num)
//清除里面的数据,但不能将此地址delete,也不能通过new指向其他地址;
//然后将a.m_num的值赋值给m_num;

return *this;
};
private:
int*   m_num;
};

在返回非引用类型的对象时,如:
A  getA(...)
{
A  a;
a.m_item = ....
.....
return  a;
}
值传递,此时
A  aa =  getA(...);
A  a;
A  aa(a);
使用的就是拷贝构造;
 A  a;
A  aa = a;
则使用的是赋值拷贝(注:它不是构造函数,而是运算符重载函数)

类中的数据即成员变量,是重载构造函数要处理的东西。特别是在当类中存在
指针时,尤其需要注意,不要出现浅拷贝,即单纯的拷贝地址或指针,而不是其值,
这样的话当右值发生变化时,左值也会变化,此时便失去其构造意义了。
拷贝构造时,要delete这些原有的地址或指针,赋值拷贝时,则不能delete这些地址。
  评论这张
 
阅读(448)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017