国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

String類的寫時拷貝實(shí)例

2020-01-26 14:16:37
字體:
供稿:網(wǎng)友

實(shí)例如下:

#include<iostream>using namespace std; class String;ostream& operator<<(ostream &out, const String&s);//引用計(jì)數(shù)器類class String_rep {  friend class String;  friend ostream& operator<<(ostream &out, const String&s);public:    String_rep(const char *str )      :use_count(0)    {      if (str == NULL)      {        data = new char[1];        data[0] = '/0';      }      else      {        data = new char[strlen(str) + 1];        strcpy(data, str);      }    }      String_rep(const String_rep &rep) :use_count(0)    {      data = new char[strlen(rep.data) + 1];      strcpy(data, rep.data);    }    String_rep& operator=(const String_rep &rep)    {      if (this != &rep)      {        delete[]data;        data = new char[strlen(rep.data) + 1];        strcpy(data, rep.data);      }      return *this;    }    ~String_rep()    {        delete[]data;        data = NULL;    }public:  void increase()  {    ++use_count;  }    void decrease()  {    if (use_count == 0)    {      delete this; //自殺行為  釋放this所指的空間,在釋放之前調(diào)動這個類的析構(gòu)函數(shù)     }  }private:    char *data;    int use_count;};////////////////////////////////////////////////////////////////////////////////////////class String{   friend ostream& operator<<(ostream &out, const String&s);public:  String(const char* str = " ")  {    rep = new String_rep(str);    rep->increase();  }  String(const String &s)  {    rep = s.rep;   //淺拷貝    rep->increase();  }  String& operator=(const String &s)  {    if (this != &s)    {      rep->decrease();  //模擬delete      rep = s.rep;      //模擬new      rep->increase();   //模擬strcpy      /*rep = s.rep;  //這會更改引用計(jì)數(shù)器指針 ,造成s內(nèi)存泄漏      rep->increase();*/    }    return *this;  }    ~String()    {      rep->decrease();    }public:  void to_upper()  {    if (rep->use_count > 1)    {      String_rep* new_rep = new String_rep(rep->data);      rep->decrease();      rep = new_rep;      rep->increase();    }    char* ch = rep->data;    while (*ch != '/0')    {      *ch -= 32;      ++ch;    }  }private:  String_rep *rep; //引用計(jì)數(shù)器};ostream& operator<<(ostream &out, const String&s){  out << s.rep->data;  return out;}void main(){  String s1("hello");  String s2(s1);  String s3;  s3 = s2;  cout << "s1=" << s1 << endl;  cout << "s2=" << s2 << endl;  cout << "s3=" << s3 << endl;   s2.to_upper();  cout << "-----------------------------------------------" << endl;    cout << "s1=" << s1 << endl;  cout << "s2=" << s2 << endl;  cout << "s3=" << s3 << endl;}

以上這篇String類的寫時拷貝實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 荥阳市| 文成县| 岳阳县| 囊谦县| 云和县| 塔城市| 南漳县| 罗田县| 柳河县| 左贡县| 齐齐哈尔市| 永靖县| 津市市| 大同县| 云梦县| 贵港市| 昌都县| 临漳县| 沙坪坝区| 青岛市| 陆良县| 固原市| 深水埗区| 禹州市| 永修县| 临猗县| 彩票| 昆明市| 太保市| 准格尔旗| 贵定县| 阿拉善左旗| 会东县| 济阳县| 威信县| 聂荣县| 连江县| 云和县| 安西县| 永泰县| 罗山县|