没有合适的资源?快使用搜索试试~ 我知道了~
C++中的位拷贝与值拷贝
3 下载量 27 浏览量
2020-12-22
19:26:14
上传
评论
收藏 49KB PDF 举报
温馨提示
试读
1页
位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝)。深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程是深拷贝,反之,没有重新分配资源,是浅拷贝。 位拷贝,及"bitwise assignment"是指将一个对象的内存映像按位原封不动的复制给另一个对象,所谓值拷贝是指,将原对象的值复制一份给新对象。 在用"bitwise assignment"时会直接将对象的内存映像复制给另一个对象,这样两个对象会指向同一个内存区域,当一个对象被释放后,另一个对象的指针会成为空指针。这时,应该编写operator=和copy co
资源详情
资源评论
资源推荐
C++中的位拷贝与值拷贝中的位拷贝与值拷贝
位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝)。深拷贝和浅拷贝可以简单理解为:如果一个
类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程是深拷贝,反之,没有重新分配资源,是浅拷
贝。
位拷贝,及"bitwise assignment"是指将一个对象的内存映像按位原封不动的复制给另一个对象,所谓值拷贝是指,将原
对象的值复制一份给新对象。 在用"bitwise assignment"时会直接将对象的内存映像复制给另一个对象,这样两个对象会指向
同一个内存区域,当一个对象被释放后,另一个对象的指针会成为空指针。这时,应该编写operator=和copy constructor来实
现值拷贝 。
默认的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函
数注定将出错。
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数会被自动调用。也是说,
当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
1、一个对象以值传递的方式传入函数体
2、一个对象以值传递的方式从函数返回
3、一个对象需要通过另外一个对象进行初始化。
如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对
象之间的位拷贝。位拷贝又称浅拷贝。自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函
数,提高源码效率。
如果没有自定义复制构造函数,则系统会创建默认的复制构造函数,但系统创建的默认复制构造函数只会执行“位拷贝”,
即将被拷贝对象的数据成员的值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向
的地址与被拷贝对象的指针所指向的地址相同,delete该指针时则会导致两次重复delete而出错。下面拿这个经典示例:
Class String{
public:
String(const char *ch=NULL);//默认构造函数
String(const String &str);//拷贝构造函数
~String(void);
String &operator=(const String &str);//赋值函数
private:
char *m_data;
};
如果以String为例定义strA和strB
int main()
{
String strA("hello");
String strB("world");
strB = strA;
// 结果导致 strA 和 strB 的指针都指向了同一个地址
// 函数结束析构时
// 同一个地址被delete两次
return 0;
}
如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那
么这两个缺省的函数隐含了错误。以类String的两个对象strA,strB为例,假设strA.m_data的内容为“hello”,strB.m_data的内
容为“world”。 现将strA赋给strB,缺省赋值函数的“位拷贝”意味着执行strB.m_data =strA.m_data。这将造成三个错误:
● strB.m_data 原有的内存没被释放,造成内存泄露;
● strB.m_data和strA.m_data指向同一块内存,strA或strB任何一方变动都会影响另一方;
● 在对象被析构时,m_data被释放了两次。
对于编译器,如果不主动编写拷贝函数和赋值函数,它会以位拷贝的方式自动生成缺省的函数。
weixin_38599430
- 粉丝: 0
- 资源: 887
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0