C++中的位拷贝和值拷贝

如何入门强化学习 很多同学在入门强化学习的时候都会遇到困难,那我这里就简单介绍一下应该如何入门强化学习,并以开源代码为例详解强化学习实战。 阅读详情

C++中的位拷贝和值拷贝

  原文:http://blog.csdn.net/liam1122/article/details/1966617

  为了便于说明我们以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还是指向原来的内存区域,但是其内容改变。

 

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

位拷贝就是传递的值是参数的地址,值拷贝就是传递的值是参数本身的值。

深拷贝拷贝的是对象,浅拷贝拷贝的是内存。

按位拷贝就是拷贝对象的时候实际会用像memcpy()这种来复制这块数据到目的对象处,按成员拷贝则要对这个类的每个成员逐一复制(这些成员可能想调用自己定义的拷贝函数). 这会比较慢.位拷贝速度快. 但语义上来说并不总是我们希望的. 所以它们也是各自有各自的用处.

参考:

http://topic.csdn.net/u/20081106/12/4ac743c8-99a2-4dd9-8532-3378e644a0f8.html?85412

C++中的拷贝拷贝探讨 拷贝是指将一个数据对象的所有(bit)复制到另一个对象中,不管对象的类型含义如何。拷贝适用于简单的数据类型或内存块的复制,而拷贝适用于大多数的数据类型,包括自定义的类类型。这种拷贝方式是根据对象的类型结构进行的,它考虑了对象的语义内部成员。最后,我们打印出源对象目标对象的,可以看到它们的是相同的。最后,我们打印出源对象目标对象的,可以看到它们的是相同的。需要注意的是,对于自定义的类类型,进行拷贝时会调用类的拷贝构造函数(如果有定义),以确保正确地复制对象的所有成员。 阅读详情

相关推荐

sphincs+ Nist Round3文档中文译版(SPHINCS+ Submission to the NIST post-quantum project, v.3)

1. 引言 哈希基础签名方案最初是由Lamport [14]在1970年代后期作为一次性签名方案开发的,并由Merkle [16]扩展为多次签名方案。这些方案的安全性易于分析,并仅依赖于所使用的哈希函数的属性。然而,Merkle基于树的签名方案需要在密钥生成时就确定要进行签名的数量,且为了保持性能这个数字要小。最重要的是,该系统需要用户记住一个状态:这个状态包含一些信息以记住密钥已经进行了多少次签名。 在Lamport方案诞生后的40年里,产生了许多想法改进了哈希基础签名的性能、实用性理论基础,最终XMS

dedanddwb的博客 370

C++中的拷贝拷贝

拷贝拷贝的是地址(也叫浅拷贝),而拷贝拷贝的是内容(深拷贝)。深拷贝拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程是深拷贝,反之,没有重新分配资源,是浅拷贝。   拷贝,及"bitwise assignment"是指将一个对象的内存映像按原封不动的复制给另一个对象,所谓拷贝是指,将原对象的复制一份给新对象。 在用"bitwise assignment"时会直接将对象的内存映像复制给另一个对象,这样两个对象会指向同一个内存区域,当一个对象被释放后,另一个对象的指针会成为空指针。这时,应该编写operator=copy co

matlab-Simulink中的LuGre摩擦模型

著名的Lund-Grenoble (LuGre)模型的Simulink框图,捕捉了各种非线性摩擦行为。已经设计了包含各种力输入的框图,以便用户能够以与原始论文类似的方式探索预滑动滞后粘滑运动。

C++ 拷贝

分享一个C++的按拷贝的代码。

凡辰道 712

C++中的拷贝拷贝深拷贝拷贝

<br /><br />为了便于说明我们以String类为例:<br />首先定义String类,而并不实现其成员函数。<br /> Class String{<br />public:<br />    String(const char *ch=NULL);//默认构造函数<br />    String(const String &str);//拷贝构造函数<br />   ~String(void);<br />   String &operator=(const String &str);//赋

为了孩子他娘 904

深入C++ 之逐拷贝(bitwise copy)

深入C++ 之逐拷贝(bitwise copy) 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 最近有重新翻阅的侯捷老师的《深度探索C++对象模型》一书,依然别有新意源源涌来,不禁感叹经典书籍的魅力,...

heary29的专栏 2260

C++语言】字符串String类的深拷贝与浅拷贝

拷贝对象时,需要创建相同的字节序、类型、资源。

风铃子加油的博客 1961

C++分段拷贝字节

memcpy可以用来拷贝原资源到目标资源的指定长度的数据,但是不能只拷贝中间的一段数据。 如果拷贝中间一段的数据,此时可能就需要逐字节拷贝 void get_bytes(uint8_t* dst_bytes,uint8_t* source_bytes){ for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; ++j) { *dst_bytes++ = *source_bytes+i*5+j+

努力的八戒 1260

C++细节 深拷贝拷贝(拷贝)详解

前提  在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。 阅读《高质量的c c++编程》,第9章有这样一段话,类似的话在《c++primer》《effective C++》都有所提及,那就是拷贝构造函数问题,这个是类编写者的一个基础问题。 拷贝(浅...

编程爱好者的博客 5万+

C++ 深拷贝拷贝(拷贝)详解

前提  在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。 阅读《高质量的c c++编程》,第9章有这样一段话,类似的话在《c++primer》《effecti...

文武傲群雄,彳亍定江山 399

拷贝拷贝、浅拷贝深拷贝

拷贝拷贝的是地址(也叫浅拷贝),而拷贝拷贝的是内容(也叫深拷贝)。 如果不主动编写拷贝构造函数函数,编译器将以“拷贝”的方式自动生成缺省的函数 现将 a赋给 b,缺省赋函数的“拷贝”意味着执行 b.m_data = a.m_data。这将造成三个错误: 一是 b.m_data 原有的内存没被释放,造成内存泄露; 二是b.m_data a.m_data 指向同一块内存,

除却猩猩不是猿 811
上一篇: C++ primer 第四版 习题3.13
下一篇: C++编程思想 require.h文件 程序代码
dfdssddfdf
博客等级 码龄15年 9粉丝 12原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值