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

拷贝构造函数

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

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

传统写法:
C/C++编程基础:基于对象的编程_第3张图片

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;
    }

现代写法:
C/C++编程基础:基于对象的编程_第4张图片

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;
    }

写时拷贝:
将深浅拷贝合二为一。浅拷贝节省内存空间,但拷贝对象不能修改内存空间的值;深拷贝能修改内存空间的值,但需要开辟新的内存空间,浪费资源。写时拷贝则是在只读时不开新空间,在要修改时开新空间。
C/C++编程基础:基于对象的编程_第5张图片
写时拷贝在字符串的首位置之前多开辟一块空间,来存放引用计数
C/C++编程基础:基于对象的编程_第6张图片

你可能感兴趣的:(C/C++,c++,编程语言,指针,面向对象编程)