C++中的位拷贝与值拷贝
2015-07-08 16:14
253 查看
以String类为例:
位拷贝拷贝的是地址,而值拷贝拷贝的是内容。
假定有两个String类对象A和B,则A.m_data和B.m_data分别指向两个不同的空间。
如果没有覆写赋值函数,执行语句:A.m_data = B.m_data;则编译器默认进行位拷贝,A.m_data与B.m_data就指向了同一块地址,虽然A.m_data的内容与B.m_data的内容一致了,但会出现如下问题:
(1)A.m_data原来指向的内存没有释放,容易出现内存泄露;
(2)当A.m_data和B.m_data中的任意一个被修改,则会影响另外一个,对数据不安全;
(3)当对象A、B析构的时候,内存将被释放两次。
当用一个已经初始化过的自定义类类型对象去初始化另一个对象的时候,拷贝函数将被自动调用。也就是说当类的对象需要拷贝时,拷贝函数就会被调用。
以下情况都会调用拷贝构造函数:
(1)一个对象以值传递的方式传入函数体;
(2)一个对象以值传递的方式从函数体返回;
(3)一个对象需要用另一个对象来初始化。
默认的拷贝构造函数是位拷贝,如果类对象中有指针类型的成员,在调用拷贝构造函数的时候就会出现两个对象的指针成员指向了同一块内存,那么就会出现上面所提的三个问题。
class String{ public: String(const char * p=NULL);//默认构造函数 ~String(void);//默认析构函数 String(const String &str);//拷贝构造函数 String & operator = (const String &str);//赋值函数 private: char * m_data; }
位拷贝拷贝的是地址,而值拷贝拷贝的是内容。
假定有两个String类对象A和B,则A.m_data和B.m_data分别指向两个不同的空间。
如果没有覆写赋值函数,执行语句:A.m_data = B.m_data;则编译器默认进行位拷贝,A.m_data与B.m_data就指向了同一块地址,虽然A.m_data的内容与B.m_data的内容一致了,但会出现如下问题:
(1)A.m_data原来指向的内存没有释放,容易出现内存泄露;
(2)当A.m_data和B.m_data中的任意一个被修改,则会影响另外一个,对数据不安全;
(3)当对象A、B析构的时候,内存将被释放两次。
当用一个已经初始化过的自定义类类型对象去初始化另一个对象的时候,拷贝函数将被自动调用。也就是说当类的对象需要拷贝时,拷贝函数就会被调用。
以下情况都会调用拷贝构造函数:
(1)一个对象以值传递的方式传入函数体;
(2)一个对象以值传递的方式从函数体返回;
(3)一个对象需要用另一个对象来初始化。
默认的拷贝构造函数是位拷贝,如果类对象中有指针类型的成员,在调用拷贝构造函数的时候就会出现两个对象的指针成员指向了同一块内存,那么就会出现上面所提的三个问题。
相关文章推荐
- C/C++中判断某一文件或目录是否存在
- DFT离散傅立叶变换C++实现
- 新加坡总理公开多年前写的数独程序源码(C++版)
- 新加坡总理公开多年前写的数独程序源码(C++版)
- FFT快速傅立叶算法纯C语言版本
- C语言内存分析
- C++调用一个成员函数的需求this指针的情况
- 黑马-C语言-结构体
- C++——对象和类
- 黑马程序员-C语言学习笔记(循环)
- C++ 开源库
- eclipse安装C++工程环境----CDT环境————eclipse开发openCV环境准备2
- 黑马程序员——C语言基础---基本运算
- 黑马-C语言-宏定义
- c++ 字符串转数字 数字转字符串
- C语言的字节对齐及#pragma pack的使用
- c++判断图片格式
- 端口映射源码C++(转)
- C++中各种类型的成员变量的初始化方法
- C++顺序容器vector、deque、list