拷贝加指针拷贝

对实例的构造就是分配一部分内存,而不对该部分内存做任何事情;
对实例的拷贝也仅仅是将原实例中的内存按位拷贝到新实例中;
而赋值运算符也是对类型实例所拥有的各信息进行拷贝。








今天早上读《effective c++》的第五章条款,想到的深拷贝、浅拷贝,对应值拷贝和位拷贝。


值拷贝和位拷贝的内容如下:


http://blog.csdn.net/liam1122/article/details/1966617
C++中的位拷贝和值拷贝
为了便于说明我们以String类为例:


首先定义String类,而并不实现其成员函数。


Class String{
public:
    String(const char *ch=NULL);//默认构造函数
    String(const String &str);//拷贝构造函数
   ~String(void);
   String &operator=(const String &str);//赋值函数
private:
   char *m_data;
};


位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个String对象A和B。A.m_data和B.m_data分别指向一段区域,
A.m_data="windows",B.m_data=“linux";


如果未重写赋值函数,将B赋给A,则编译器会默认进行位拷贝,A.m_data=B.m_data,此为浅拷贝。


则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:


(1):A.m_data原来指向的内存区域未释放,造成内存泄露。


(2):A.m_data和B.m_data指向同一块区域,任何一方改变都会影响另一方


 (3):当对象被析构时,B.m_data被释放两次。


对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。


如果重写赋值函数和拷贝构造函数后,


A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋给A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变。


实现深拷贝需要2句话:


m_data = new char(sizeof(B.m_data));


mmcpy(m_data, B.m_data, sizeof (B.m_data));


如果浅拷贝(编译器默认提供)


就是


m_data = B.m_data



显然2者有很大的不同,


这就是为什么当类型为HasPtr即类型为带有指针成员的类的时候,要自己实现复制构造函数的原因






=================================================================================

=================================================================================

c中指针赋值和指针复制的区别

2013-08-07   阿超lmj    阅 5344  转 3
在c语言中:
char *p,*q;//声明了两个指针变量
p=q;//p、q两指针指向同一内存区域(即指针值复制),指向的地址一样。
*p=*q;//p、q两指针指向的内存的内容是一样的(即指针内容复制),但是指向的地址不一定一样。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值