C/C++编程基础:基于对象的编程

拷贝构造函数

三种拷贝方式:浅拷贝、深拷贝以及写时拷贝
浅拷贝:
又称位拷贝。 将原对象或原数组的引用直接赋给新对象,新数组,新对象只是原对象的一个引用(等号操作)。只拷贝了的指针的值,实际上变成了多个指针对象指向同一个地址,共用同一块内存。例子如下:
在这里插入图片描述
实际使用:
当对象中的值不能进行改变是一个const常量时,对象只可进行读不能进行修改,使用浅拷贝可减少内存的开销。
C++中不能使用memcpy和realloc等函数,会发生浅拷贝。

深拷贝:
浅拷贝中的多个对象指向同一块内存,当原对象改变内存空间里面的值时,其他拷贝对象的值会随之发生改变。
深拷贝不仅拷贝指针的值,还会开辟新的内存空间,将内容拷贝到新的内存空间。
在这里插入图片描述
深拷贝主要依靠拷贝构造函数和赋值运算符的重载两个步骤来实现,深拷贝有两种写法:传统写法和现代写法。

传统写法:
在这里插入图片描述

STRING( const STRING& s )
    {
        //_str = s._str;
        _str = new char[strlen(s._str) + 1];
        strcpy_s( _str, strlen(s._str) + 1, s._str );
    }
    STRING& operator=(const STRING& s)
    {
        if (this != &s)
        {
            //this->_str = s._str;
            delete[] _str;
            this->_str = new char[strlen(s._str) + 1];
            strcpy_s(this->_str, strlen(s._str) + 1, s._str);
        }
        return *this;
    }

现代写法:
在这里插入图片描述

STRING( const STRING& s ):_str(NULL)
    {
        STRING tmp(s._str);// 调用了构造函数,完成了空间的开辟以及值的拷贝
        swap(this->_str, tmp._str); //交换tmp和目标拷贝对象所指向的内容
    }
    STRING& operator=(const STRING& s)
    {
        if ( this != &s )//不让自己给自己赋值
        {
            STRING tmp(s._str);//调用构造函数完成空间的开辟以及赋值工作
            swap(this->_str, tmp._str);//交换tmp和目标拷贝对象所指向的内容
        }
        return *this;
    }

写时拷贝:
将深浅拷贝合二为一。浅拷贝节省内存空间,但拷贝对象不能修改内存空间的值;深拷贝能修改内存空间的值,但需要开辟新的内存空间,浪费资源。写时拷贝则是在只读时不开新空间,在要修改时开新空间。
在这里插入图片描述
写时拷贝在字符串的首位置之前多开辟一块空间,来存放引用计数
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值