码迷,mamicode.com
首页 > 编程语言 > 详细

Coding之路——重新学习C++(6):一个String类

时间:2014-09-28 15:43:03      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   ar   sp   div   on   c   

  这个String类是对运算符重载和以前知识的一个综合应用,提供了值语义、字符串读写、检查和不检查的访问、流I/O和字符串拼接等功能。

1.String类的定义

class String{
    //类型的定义
    struct Srep;        //表示能被几个同样值的String共享
    Srep *rep;
publicclass Cref;         //实现下标运算,区别对待读操作和写操作
    class Range();   //范围错误时抛出的异常

    //构造、赋值和析构函数
    String();                                         //x = "";
    String(const char*);                       //x ="abc";
    String(const String&);                    //x = other_string;
    String& operator=(const char*);
    String& operator=(const String&);
    ~String();
    
    //带检查的访问运算符
    void check(int i) const{if(i < 0 || rep->sz < i) throw Range();}
    char read(int i) const{return rep->s[i];}
    void write(int i, char c){
        rep = rep->get_own_copy(); 
        rep->s[i] =c;
    }
    Cref operator[](int i){
        check(i);
        return Cref(*this, i);
    }
    char operator[](int i) const{
        check(i);
        return rep->s[i];
    }
    int size() const{return rep->sz;}

    //其他String操作
    String& operator+=(const String&);
    String& operator+=(const char*);

    friend ostream& operator<<(ostream&, const String&);
    friend istream& operator>>(ostream&, String&);
    friend bool operator==(const String& x, const char *s){
        return strcmp(x.rep->s, s)==0;
    }
    friend bool operator==(const String& x, const String& y){
        return strcmp(x.rep->s, y.rep->s)==0;
    }
};
String operator+(const String&, const String&);
String operator+(const String&, const char*);
String operator+(const char*, const String&);    

2.Srep类:实现同样值的String类的共享

struct String::Srep{
    char *s;        //到元素的指针
    int sz;           //字符个数
    int n;             //引用计数

    Srep(int nsz, const char *p){
        n = 1;
        sz = nsz;
        s = new char[sz + 1];
        strcpy(s, p);
    }

    ~Srep(){
        delete s;
    }

    Srep* get_own_copy(){        //实现写时复制。
        if(n == 1) return this;
        n--;
        return new Srep(sz, s);
    }
    void assign(int nsz, const char* p){
        if(sz != nsz){
            delete []s;
            sz = nsz;
            s = new char[sz + 1];
        }   
        strcpy(s, p);
    }
private:
    Srep(const Srep&);
    Srep& operator=(const Srep&);
};

 3.String的复制实现

String::String(){                                 //空串为默认值
    rep = new Srep(0, "");
}

String::String(const String& x){         //拷贝构造函数
    x.rep->n++;
    rep = x.rep;
}

String::~String(){                              //析构函数
    if(--n == 0) delete rep;
}

String& operator=(const String& x){   //复制赋值
     x.rep->n++;
     if(--n == 0) delete rep;
     rep = x.rep;
     return *this;
}

String::String(const char *s){
    rep = new Srep(strlen(s), s);
}

String& operator=(const char *s){   //复制赋值
     if(rep->n == 1) 
        rep->assign(strlen(s), s);
     else{
        rep->n--;
        rep = new Srep(strlen(s), s);
    }
     return *this;
}

4.实现读和写的Cref

class String::Cref{
    friend class String;
    String &s;
    int i;
    Cref(String &ss, int ii):s(ss), i(ii){}
public:
    operator char() const{ return s.read(i);}
    void operator=(char c){s.write(i, c);}
};

 

 

    

Coding之路——重新学习C++(6):一个String类

标签:style   blog   color   os   ar   sp   div   on   c   

原文地址:http://www.cnblogs.com/xskCoder/p/3998076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!