您的位置:首页 > 编程语言 > C语言/C++

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

2015-07-08 16:14 253 查看
以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)一个对象需要用另一个对象来初始化。

默认的拷贝构造函数是位拷贝,如果类对象中有指针类型的成员,在调用拷贝构造函数的时候就会出现两个对象的指针成员指向了同一块内存,那么就会出现上面所提的三个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: