关闭

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

186人阅读 评论(0) 收藏 举报
分类:

以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)一个对象需要用另一个对象来初始化。

默认的拷贝构造函数是位拷贝,如果类对象中有指针类型的成员,在调用拷贝构造函数的时候就会出现两个对象的指针成员指向了同一块内存,那么就会出现上面所提的三个问题。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10223次
    • 积分:346
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:10篇
    • 译文:1篇
    • 评论:1条
    文章分类
    最新评论