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

原创 2015年07月08日 16:14:24

以String类为例:

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++拷贝构造函数详解

一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂...
  • lwbeyond
  • lwbeyond
  • 2011年02月23日 13:39
  • 280323

C++::浅拷贝,深拷贝,引用计数的拷贝,写时拷贝

【什么情况下会用到c++中的拷贝构造函数】:  1)用已经存在的同类的对象去构造出另一个新的对象   2)当函数的形参是类的对象时,这时调用此函数,使用的是值的拷贝,也会调用拷贝构造函数   3)当...
  • lalu58
  • lalu58
  • 2017年01月04日 21:47
  • 1178

C++的深拷贝与浅拷贝

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a;  而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单...
  • lpp0900320123
  • lpp0900320123
  • 2014年09月02日 15:35
  • 40168

c++中内存拷贝函数(C++ memcpy)详解

原型:void*memcpy(void*dest, const void*src,unsigned int count);  功能:由src所指内存区域复制count个字节到dest所指内存区域。 ...
  • sszgg2006
  • sszgg2006
  • 2012年09月17日 21:30
  • 51846

拷贝控制

拷贝控制操作包括拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。如果一个类没有定义所有这些拷贝控制成员,编译器会为它定义缺失的操作(尽量明确定义对象拷贝、赋值、移动或者销毁时做什...
  • daaikuaichuan
  • daaikuaichuan
  • 2018年01月24日 21:36
  • 38

PC端到WinCE端文件互相拷贝

电脑端 Windows Mobile 设备中心必须可以连接到手持设备 首先需要引用 OpenNETCF.Desktop.Communication   源代码下载地址如下 https://s...
  • easyboot
  • easyboot
  • 2016年08月29日 10:04
  • 1609

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

为了便于说明我们以String类为例:首先定义String类,而并不实现其成员函数。Class String{public:    String(const char *ch=NULL);//默认构造...
  • liam1122
  • liam1122
  • 2007年12月25日 15:59
  • 6535

位拷贝、值拷贝、深拷贝、浅拷贝

http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以String类为例: 首先定义String类,而并不实现其成员函数...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年09月28日 17:20
  • 1204

C++拷贝构造器之浅拷贝与内存重析构

一般构造器、析构器、拷贝构造器会被称之为构造函数、析构函数与复制构造函数,但是其与函数还是有一些区别,所以我们以“器”来称呼之。1、构造器、析构器与拷贝构造器:(1)、构造器简析: constru...
  • Apollon_krj
  • Apollon_krj
  • 2017年03月12日 16:49
  • 446

c++ copy construct

Expression Post-conditions T u = v; The value of u is equivalent to the value of v. The ...
  • sunning9001
  • sunning9001
  • 2015年04月26日 21:37
  • 808
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的位拷贝与值拷贝
举报原因:
原因补充:

(最多只允许输入30个字)