C++——浅拷贝深拷贝

Posted 一棵灬胡杨树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++——浅拷贝深拷贝相关的知识,希望对你有一定的参考价值。

这篇blog只是做一个简单的记录,让自己看到这个程序时有一个简单的理解过程,不做任何画图讲解

#include <iostream>
using namespace std;

//前置声明
class string;

//计数器
class string_rep

    friend class String;
public:
    //构造函数
    explicit string_rep(const char* str = ""):m_count(0)
    
        m_data = new char[strlen(str) + 1];
        strcpy(m_data,str);
    
    //拷贝构造函数
    string_rep(const string_rep &rep):m_count(0)
    
        //浅拷贝
        m_data = rep.m_data;
    
    //赋值重载
    string_rep&operator=(const string_rep &rep)
    
        if (this != &rep)
        
            m_data = rep.m_data;
        
        return *this;
    
    //析构
    ~string_rep()
    
        delete []m_data;
        m_data = nullptr;
    

public:
    //计数器+1
    void increment()
    
        m_count++;
    
    //计数器-1
    void decrement()
    
        m_count--;
        if (m_count == 0)
        
            delete this;
        
    
    char* GetData()const
    
        return m_data;
    

private:
    char* m_data;
    int m_count;
;

class String

public:
    explicit String (const char *str=""):pn(new string_rep(str))
    
        pn ->increment();
    
    String(const String &s):pn(s.pn)
    
        pn ->increment();
    
    String&operator=(const String &s)
    
        if (this != &s)
        
            //这里先对计数器减1的操作是因为当你进行赋值的时候,改变了pn的指向,其原来的计数器m_count必须-1;
            pn ->decrement();
            pn = s.pn;
            pn ->increment();
        
        return *this;
    
    ~String()
    
        pn ->decrement();
    

public:
    //写时拷贝(转换大小写)
    void to_upper()
    
        auto *new_pn = new string_rep(pn ->m_data);
        pn ->decrement();
        pn = new_pn;
        pn ->increment();

        char *p = pn ->m_data;
        while (*p != '\\0')
        
            if (*p >= 'a' && *p <= 'z')
                *p -= 32;
            p++;
        
    
private:
    string_rep *pn;
;

以上是关于C++——浅拷贝深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

C++:浅拷贝与深拷贝

C++:浅拷贝与深拷贝

C++——浅拷贝深拷贝写时拷贝详解

C++——浅拷贝深拷贝写时拷贝详解

C++——浅拷贝深拷贝写时拷贝详解

C++ 浅拷贝 & 深拷贝