`

位拷贝和值拷贝

    博客分类:
  • C++
阅读更多

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


文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppsl/20071226/93559.html

分享到:
评论

相关推荐

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

    介绍了C++中的位拷贝和值拷贝,对初学者很有帮助的哦!

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

    位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝)。深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程是深拷贝,反之,没有重新...

    C#中的浅拷贝和深拷贝

    C#中的浅拷贝和深拷贝 C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。

    Python中列表和数组的赋值以及-浅拷贝和深拷贝的实例讲解

    对Python中列表和数组的赋值 中 ,浅拷贝和深拷贝的实例讲解 浅 引⽤: 列表赋值: 1234567>>> a = [1, 2, 3] >>> b = a >>> print...b指向这个新的内存区域,因此改变a所指向的对象的值,不会影响b 列表深拷贝和浅拷贝

    两个对象属性值的拷贝和文件的拷贝

    实现了两个对象之间属性值的拷贝,只要具有相同的属性名就可以拷贝,还有两个file对象的拷贝,实现文件的复制功能

    java值拷贝

    包含了两个JAR包:commons-beanutils.jar和atleap-common.jar以及两个自己写的扩展beanutils的类。比较有用的

    java深入理解浅拷贝和深拷贝

    java的赋值都是传值的,对于基础类型来说,会拷贝具体的内容,但是对于引用对象来说,存储的这个值只是指向实际对象的地址,拷贝也只会拷贝引用地址。 因为引用对象的存在,所以经常会出现和预期不一样的情况。 本文...

    dotnet-ShengMapper对象属性值映射拷贝工具

    对象属性值映射/拷贝工具。不需要创建映射规则,不要求对象类型一致,适用于简单直接的拷贝操作,可以全属性拷贝,指定属性拷贝,排除指定的属性。拷贝包含 10 个属性的对象 10 万次,耗时 4.x 秒(普通开发机)。

    拷贝input框的值

    把一个input框的值拷贝到另一个input框

    拷贝JSON对象值进Java Bean对象

    NULL 博文链接:https://loven-11.iteye.com/blog/952161

    定义一个名为complex 的复数类,其属性数据为复数的实部和虚部,要求构造函数和拷贝构造函数,并能打印复数的值

    定义一个名为 的复数类,其属性数据为复数的实部和虚部,要求构造函数和拷贝构造函数,并能打印复数的值

    14 - JavaScript 引用和值拷贝.rar

    14 - JavaScript 引用和值拷贝.rar

    C++ 类的深拷贝

    (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)...

    对浅拷贝、深拷贝、写时拷贝的简单认识

    也称位拷贝或值拷贝。如果对象中管理资源,编译器只是将对象中的值拷贝过来,就会导致多个资源共享一份资源,当一个对象销毁时就会将该资源释放,而这时另一些对象不知道该资源已经被释放,以为还有效,所以,对资源...

    C#深拷贝 C#深拷贝

    C#深拷贝;C#深拷贝;C#深拷贝;C#深拷贝;C#深拷贝;C#深拷贝;

    JS浅拷贝和深拷贝原理与实现方法分析

    本文实例讲述了JS浅拷贝和深拷贝原理与实现方法。分享给大家供大家参考,具体如下: 浅拷贝只会拷贝一层,深层的引用类型改变还是会受到影响。 深拷贝是所有内部的属性还有值都被拷贝了一份,不管深层的引用类型怎么...

    C/C++ 浅拷贝和深拷贝的实例详解

    C/C++ 浅拷贝和深拷贝的实例详解 深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。 浅拷贝就是对内存地址...

    浅拷贝和深拷贝深入理解(shallow copy VS deep copy)

    引言C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解。 本文重点...

    python的深拷贝与浅拷贝

    前两天在用python写A*算法的时候,被python的深拷贝和浅拷贝恶搞了一番,实际上还是因为没搞清楚哪些是深拷贝,哪些是浅拷贝,现特意写一篇小结,加深理解。 什么是浅拷贝 所谓浅拷贝,就是复制了地址,实质上是产生...

    利用反射技术实现POJO值拷贝

    NULL 博文链接:https://lcb530.iteye.com/blog/288977

Global site tag (gtag.js) - Google Analytics