zoukankan      html  css  js  c++  java
  • 引用计数——深拷贝&浅拷贝

    下面是用代码实现:

    private:
        char *data;
        size_t use_count;
    public:
        //构造函数
        String_rep(const char *str = ""):use_count(0)
        {
            if(str == NULL)
            {
                data = new char[1];
                data[0] = '';
            }
            else
            {
                data = new char[strlen(str)+1];
                strcpy(data,str);
            }
        }
        //拷贝构造函数
        String_rep(const String_rep &rep);
        //析构函数
        ~String_rep()
        {
            if(use_count == 0)
            {
                delete[] data;
                data = NULL;
            }
        }

    private:
        String_rep *rep;
    public:
        String(const char *str = ""):rep(new String_rep(str))
        {
            rep->increment();
        }
        String(const String &s)
        {
            rep = s.rep;
            rep->increment();
        }
        ~String()
        {
            rep->decrement();
        }

    注意理解下面这一段:(调试记录图)

      //析构函数
        ~String_rep()
        {
            if(use_count == 0)
            {
                delete[] data;
                data = NULL;
            }
        }

    还要注意一点,如果要修改其中的内容的话就得先开一块空间,把值拷贝过来然后,再在里面进行修改。

    eg:

    void upper()
        {
            rep->decrement();
            rep = new String_rep(rep->data);
            
            int n = strlen(rep->data);
            for(int i=0;i<n;++i)
            {
                if(rep->data[i] >='a'&&rep->data[i]<='z')
                    rep->data[i] = rep->data[i] - 32;
            }
            rep->increment();
     
        }

    以String类的实现来做个示例:

    #pragma once
    #include<iostream>
    using namespace std;
     
    class String;
    ostream& operator<<(ostream &out, const String &s);
    void Turn(String &s);
     
    class String_rep
    {
        friend void Turn(String &s);
        friend class String;
        friend ostream& operator<<(ostream &out, const String &s);
    private:
        char *data;
        size_t use_count;
    public:
        //构造函数
        String_rep(const char *str = ""):use_count(0)
        {
            if(str == NULL)
            {
                data = new char[1];
                data[0] = '';
            }
            else
            {
                data = new char[strlen(str)+1];
                strcpy(data,str);
            }
        }
        //拷贝构造函数
        String_rep(const String_rep &rep);
        //析构函数
        ~String_rep()
        {
            if(use_count == 0)
            {
                delete[] data;
                data = NULL;
            }
        }
    public:
        void increment()
        {
            ++use_count;
        }
        void decrement()
        {
            --use_count;
        }
    };
    class String
    {
        friend void Turn(String &s);
        friend ostream& operator<<(ostream &out, const String &s);
    private:
        String_rep *rep;
    public:
        String(const char *str = ""):rep(new String_rep(str))
        {
            rep->increment();
        }
        String(const String &s)
        {
            rep = s.rep;
            rep->increment();
        }
        ~String()
        {
            rep->decrement();
        }
        String &operator = (const String &s)
        {
            if(this !=&s)
            {
                rep->decrement();
                rep = s.rep;
                rep->increment();
            }
            return *this;
        }
        String &operator+(const String &s1)
        {
            char *tempch;
            int n = strlen(rep->data)+strlen(s1.rep->data)+1;
            tempch = new char[n];
            strcpy(tempch,rep->data);
            strcat(tempch,s1.rep->data);
            String *temp;
            temp = new String(tempch);
            temp->rep->decrement();
            return *temp;
        }
        String &operator+=(const String &s1)
        {
            char *tempch;
            int n = strlen(rep->data)+strlen(s1.rep->data)+1;
            tempch = new char[n];
            strcpy(tempch,rep->data);
            strcat(tempch,s1.rep->data);
     
            String_rep *temp;
            temp = new String_rep(tempch);
            int remsize = rep->use_count;
            rep = temp;
            rep->use_count = remsize;
            delete tempch;
            return *this;         
        }
        void upper()
        {
            rep->decrement();
            rep = new String_rep(rep->data);
            
            int n = strlen(rep->data);
            for(int i=0;i<n;++i)
            {
                if(rep->data[i] >='a'&&rep->data[i]<='z')
                    rep->data[i] = rep->data[i] - 32;
            }
            rep->increment();
     
        }
    };
    ostream& operator<<(ostream &out, const String &s)
    {
        out<<s.rep->data;
        return out;
    }

    使用轮子:

    #include"use_count_string.h"
    int main()
    {
        String st1("asdfghj");
        String st2(st1);
        String st6(st1);
        String st7(st1);
        String st3("qwerty");
        String st5("Anna");
        String st4;
        st4 = st1 + st3;
        st5 += st3; 
        st1 = st3;
        cout<<"st1 = "<<st1<<endl;
        cout<<"st2 = "<<st2<<endl;
        cout<<"st3 = "<<st3<<endl;
        cout<<"st4 = "<<st4<<endl;
        cout<<"st5 = "<<st5<<endl;
        st2.upper();
        cout<<"st2 = "<<st2<<endl;
        return 0;
    }
  • 相关阅读:
    将最大主机/ DNS名称字符长度从63增加到255
    e3 cpu
    项目结构图
    Nyquist–Shannon sampling theorem 采样定理
    提高比特率 有损 无损 Video-and-Audio-file-format-conversion 视频声音转码
    比特率计算
    外微分
    功与路径无关的条件
    14.10.4 Defragmenting a Table 整理表
    14.10.4 Defragmenting a Table 整理表
  • 原文地址:https://www.cnblogs.com/cjn123/p/10665930.html
Copyright © 2011-2022 走看看