码迷,mamicode.com
首页 > 编程语言 > 详细

“位拷贝”和“值拷贝”的区别(c++)

时间:2016-03-12 14:56:19      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:“位拷贝” “值拷贝”

以string类为例:


技术分享


位拷贝拷贝的是地址,而值拷贝拷贝的是内容。

若定义string类的两个对象为str1,str2。str1._str和str2._str分别指向一块空间。

str1._str = “zhang”,str2._str = “tian”。


若默认拷贝构造函数,即str1(str2)。编译器将str2进行一份位拷贝。str1和str2指向同一块空间。

若默认赋值函数,即str1 = str2。编译器将str2的值赋值给str1,进行的也是位拷贝。


无论是默认拷贝构造函数还是赋值函数,都将str1的内容改变了。但是可能会出现以及问题:

(1)str1._str以前的内存未释放。

(2)改变str1._str的内容时,str2._str的内容也发生了改变,因为它们指向同一块内存。

(3)同一块内存会被释放两次。


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


若采用自定义的拷贝构造函数,即str1(str2)。编译器只是将str2._str的内容拷贝了一份。即为值拷贝。而str1._str和str2._str是分别指向一块空间。

若采用自定义的赋值函数,即str1 = str2。编译器将str2._str的内容赋值给str1._str,虽然str1._str的内容发生了改变,但是str1._str和str2._str指向不同的内存。

“位拷贝”和“值拷贝”的区别(c++)

标签:“位拷贝” “值拷贝”

原文地址:http://10810429.blog.51cto.com/10800429/1750198

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!