“位拷贝”和“值拷贝”的区别(c++)
2016-03-12 12:30
246 查看
以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指向不同的内存。
位拷贝拷贝的是地址,而值拷贝拷贝的是内容。
若定义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++ String类的构造函数、拷贝构造函数的实现
- C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝
- 值类型与引用类型
- C++之拷贝构造函数
- 详解JS数据类型的值拷贝函数(深拷贝)
- 【HPU】[1006]DNA
- 四则运算C语言程序
- C++ 通过友元函数对类进行iostream流重载
- C++/C中的预处理命令;
- C++ 面试题
- 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针
- 数值的整数次方
- C++中输入输出缓冲区的刷新
- 对C语言中指针的理解与其基础使用实例
- [手游新项目历程]第6天-二进制值和十六进制字符串相互转换的C++代码
- C和C++ const的声明差异
- C和C++ const的声明差异
- 简单了解C语言中直接插入排序与直接选择排序实现
- C++ constexpr类型说明符
- C++ constexpr类型说明符