abc2001的笔记 https://passport2.21ic.com/?35616 [收藏] [复制] [RSS]

日志

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

已有 638 次阅读2008-1-16 12:18 |系统分类:嵌入式系统

为了便于说明我们以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对象ABA.m_dataB.m_data分别指向一段区域,A.m_data="windows",B.m_data=linux";


如果未重写赋值函数,将B赋给A;则编译器会默认进行位拷贝,A.m_data=B.m_data


A.m_dataB.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:


(1):A.m_data原来指向的内存区域未释放,造成内存泄露。


(2):A.m_dataB.m_data指向同一块区域,任何一方改变都会影响另一方


 (3):当对象被析构时,B.m_data被释放两次。


对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。


如果重写赋值函数和拷贝构造函数后,


A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋给A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)