亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++中實現繼承string類的MyString類的步驟

2020-01-26 14:38:06
字體:
來源:轉載
供稿:網友

昨天師兄又出了道測試題,讓我們實現類似于string類的沒有MyString類,剛開始很頭疼,可是真正在自己寫代碼的時候又很興奮的發現,這個過程真的是個很寶貴的機會,讓我又有機會可以很好的熟悉回顧C++的很多知識―類設計,構造析構函數,成員函數,友元函數,引用,重載,字符串操作,動態內存分布。。。。。于是昨天花了半天時間寫了300多行代碼,并認真的進行了相關測試、修改和總結。因為內容有點豐富,所以想分幾次寫出來,條理也清楚些。

類的空間分配:類給它的每個對象都分配了獨立的空間去存儲它的數據成員,所有的對象公共的訪問類方法進行操作。同時在對象的獨立空間中,不包括數據成員動態分配的空間,對象只是記錄了動態分配空間的地址(所以在析構函數調用的時候只是刪除了對像空間,同時需要用new來刪除動態分配的地址)。

一、類聲明―mystring.h:
1. 構造函數:
專門用于構建新對象,給成員數據分配必要的內存空間并將值賦給新對象的成員數據。
默認構造函數:
在未提供顯式初始化值時,被用來創建對象的構造函數(所以它一般沒有參數)

MyString();

復制構造函數:
用于將一個對象復制到新創建的對象中(當然這個被復制的對象必須已經存在)。

MyString(const MyString &str);

給定了一定初始化參數的構造函數:
參數列表中的值會一次賦給新創建對象的各個成員函數:

MyString(const char*str);

2.析構函數:
當對象過期時刪除對象所占的內存空間,并且當對象創建時有用New請求的內存空時,在析構函數中同時要調用delete對原來分配的 內存空間進行釋放,以防止內存泄露。
~MyString();

3.成員函數:
重載賦值成員函數:

MyString &operator=(const MyString &str);    //利用已有的string對象通過=給一個對象進行賦值MyString &operator=(const char*str);       //直接用常量字符串進行賦值

一般賦值函數:

MyString &assign(const MyString&str);MyString &assign(const char*sstr);

幾個處理字符串的成員函數:

size_t getsize()const;                  //返回字符串大小void clear();                      //把字符串清空bool empty();                       //判斷字符串是否為空void swap(MyString &str);              //交換兩個字符串int compare(const MyString &str)const;      //比較2個字符串的大小//第一個const說明顯式調用的字符串不可更改,括號外面的const說明隱式調用的字符串不可更改,只讀數據    int compare(const char*str);           

追加函數:

MyString &operator+=(const MyString&str);MyString &operator+=(const char*str);MyString &append(const MyString&str);MyString &append(const char *str);

生成字串:

MyString substr(size_t pos = 0,n=npos) const; 
生成字串,從第0個位置開始長度為n,若N超過長度,則為輸出整個字符串的長度

4.友元函數(運算符重載):
友元函數一般都是在類得聲明中進行定義,它不屬于類得成員函數,但是它和類得成員函數一樣同樣的可以對類得所有數據成員進行訪問。

friend bool operator==(const MyString &str1,const MyString &str2);friend bool operator==(const char *str,const MyString &str2);friend bool operator==(const MyString &str1,const MyString *str2);friend bool operator>(const MyString &str1,const MyString &str2);friend bool operator>(const char*str1,const MyString &str2);friend bool operator>(const MyString &str1,const char*str2);

同樣還有<等各種比較。

friend MyString operator+(const MyString &str1,const MyString &str2);friend MyString operator+(const char*str1,const MyString &str2);      //兩個字符串進行相加friend MyString operator+(const MyString &str1,const char*str2);friend ostream & operator<<(ostream &os,const MyString &str);       //輸出命令符的重載

5.成員數據變量:

char *string;                     //指向字符串的指針int length;                       //字符串的長度static const int string_number = 0;      //計數創建的字符串的數目

二、實現.cpp文件:
1.構造函數和析構函數:

MyString::MyString() {   length = 0;   string = new char;   char *s = "/0";   memcpy(string,s,1);   ++string_number; }  MyString::MyString(const char*str) {   length = strlen(str);   string = new char(length+1);   memcpy(string,s,length);   ++string_number; } MyString::MyString(MyString &str) {   length = str.length;   string = str.string;   ++string_number; }  MyString::~MyString() {     delete[]string;   --string_number; } 

幾個注意的問題:
1)構造函數中必須給所有的數據成員進行初始化。
2)注意在給指向字符串的指針賦值時,左右類型的對應。
char *s代表一個指向字符串的指針,所有右邊必須是一個字符串常量“/0”,而不能是‘/0'.
3)一個指針只能指向一個地址,不能同時指向兩個。
在給string分配了地址之后,下一步我們肯定是確定分配的地址中存放的具體內容,那么這個時候我們都是使用strcpy()或者是
memcpy()把對應的字符串存入地址中。
如果原來我們成這樣實現:

   MyString::MyString()  {    length = 0;    string = new char;    string = "/0";    ++string_number;  }

那么我們在編譯和實現的時候都不會發現有什么錯,但是析構函數使用delete【】釋放內存使執行結果會出現亂碼,因為string=“/0”
讓它指向了一個字符串,并沒有分配內存空間,所以在釋放的時候就會出現錯誤。
4)析構函數中的重要語句 delete【】不要忘
析構函數在使用的時候只會釋放為對象分配的空間,但是對象的空間中只是存儲了數據成員分配內存的地址,所以并沒有釋放數據成員
的內存空間,必須使用delete[]來進行釋放,防止內存泄露 
2.重載運算符的成員函數:

MyString &MyString::operator+=(const MyString&str) {    char *dest;    dest = new char[str.length+length+1];    memcpy(dest,string,length);    memcpy(dest+length,str.string,str.length+1);    delete[]string;    length = length+str.length;    string = dest;    return*this; } MyString &MyString::operator+=(const char*str) {    char *dest;    dest = new char[strlen(str)+length+1];    memcpy(dest,string,length);    memcpy(dest+length,str,strlen(str)+1);    delete[]string;    string = dest;    return *this; }   //字符串賦值 MyString &MyString::operator=(const MyString&str) {   if(&str == this)     return *this;   delete[]string;   string = new char[str.length];   memcpy(string,str.string,str.length);   length = str.length;   return *this; } 

 
注意的亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

欧美在线观看视频| 在线观看欧美成人| 黑人巨大精品欧美一区二区| 亚洲美女久久久| 国产精品精品久久久久久| 日韩av在线播放资源| 国内精品久久久久| 国产精品爽黄69天堂a| 国产精品va在线| 国产精品91久久久久久| 97超级碰碰碰久久久| 国产中文字幕亚洲| 日本伊人精品一区二区三区介绍| 日韩成人在线视频观看| 38少妇精品导航| 在线亚洲午夜片av大片| 91国产视频在线| 97免费中文视频在线观看| 欧美性开放视频| **欧美日韩vr在线| 国产精品久久久av久久久| 中文字幕亚洲一区在线观看| 亚洲日韩欧美视频| 欧美性猛交xxxxx免费看| 久热99视频在线观看| 97国产精品久久| 亚洲国产精品va在线看黑人动漫| 亚洲国产成人精品一区二区| 国产精品久久久久久久7电影| 亚洲在线视频观看| 亚洲自拍在线观看| 精品欧美国产一区二区三区| 国产精品欧美久久久| 伊人一区二区三区久久精品| 欧美日韩视频在线| 日韩精品久久久久久久玫瑰园| 国产精品久久久久免费a∨大胸| 亚洲自拍偷拍区| 欧美在线视频一区| 最近2019中文字幕大全第二页| 欧美性猛交xxxx富婆| 色噜噜久久综合伊人一本| 国产午夜精品美女视频明星a级| 国产91ⅴ在线精品免费观看| 91精品国产色综合久久不卡98| 欧美日韩成人在线视频| xxx成人少妇69| 国产在线高清精品| 亚洲白拍色综合图区| 国产精品偷伦视频免费观看国产| 亚洲精品一区二区三区婷婷月| 韩国三级日本三级少妇99| 久久亚洲精品一区| 97在线观看视频| 成人亚洲欧美一区二区三区| 日韩中文视频免费在线观看| 久久久亚洲网站| 中文字幕成人精品久久不卡| 亚洲欧美日韩中文视频| 国产mv免费观看入口亚洲| 91av在线国产| 这里只有精品视频在线| 欧美电影在线免费观看网站| 福利一区福利二区微拍刺激| 国产精品高清网站| 精品久久久91| 色哟哟入口国产精品| 欧美老女人www| 九九热这里只有精品6| 国产精品视频永久免费播放| 国产精品综合不卡av| 国产一级揄自揄精品视频| 日韩av资源在线播放| 欧美精品福利在线| 亚洲第一二三四五区| 国产欧美一区二区白浆黑人| 国产精品久久久久久久久久东京| 精品国产福利在线| 国内精品视频一区| 久久久久久亚洲精品中文字幕| 国产精品视频自拍| 久久久久久成人| 国产精品入口日韩视频大尺度| 久久精品国产亚洲精品2020| 亚洲美女在线观看| 国产精品成人aaaaa网站| 欧美激情第6页| 岛国av午夜精品| 久久影院模特热| 成人在线中文字幕| 1769国内精品视频在线播放| 久久国产精品影片| 亚洲欧美日韩中文在线制服| 91精品91久久久久久| 91日本在线视频| 成人网在线观看| 精品视频—区二区三区免费| 日韩免费黄色av| 韩剧1988免费观看全集| xvideos国产精品| 亚洲精品国精品久久99热一| 精品久久久一区| 日韩电影大全免费观看2023年上| 日韩精品极品视频免费观看| 国产日韩精品在线播放| 国产专区精品视频| 亚洲深夜福利视频| 日韩在线观看免费| 成人精品一区二区三区| 国产免费久久av| 欧美做受高潮1| 亚洲free嫩bbb| 国产精品久久婷婷六月丁香| 亚洲男人的天堂在线| 中文日韩电影网站| 久久久久久久久久国产| 欧美一级片免费在线| 国产精品三级久久久久久电影| 在线视频日本亚洲性| 97在线视频免费播放| 精品一区二区三区三区| 91av福利视频| 欧美成人精品一区二区三区| 成人午夜在线观看| 久久777国产线看观看精品| 亚洲视频在线免费看| 国产精品一区二区三区免费视频| 日韩精品久久久久| 亚洲精品久久久久久久久久久久久| 欧美丰满片xxx777| 91超碰caoporn97人人| 国产在线观看一区二区三区| 国产一区红桃视频| 91免费看片网站| 欧美日韩国产综合视频在线观看中文| 岛国av午夜精品| 成人自拍性视频| 成人久久久久久久| 亚洲色图av在线| 美女啪啪无遮挡免费久久网站| 久久99久久99精品免观看粉嫩| 日韩在线不卡视频| 亚洲欧美精品中文字幕在线| 国产欧美日韩综合精品| 日韩av有码在线| 亚洲第一视频网| 欧美最猛性xxxxx免费| 欧美亚洲成人网| 岛国av在线不卡| 亚洲欧美中文另类| 国内精品久久影院| 国产午夜精品理论片a级探花| 欧美在线观看视频| 亚洲精品网址在线观看| 日韩欧美国产骚| 97在线看免费观看视频在线观看| 亚洲成人av片在线观看| 精品日本高清在线播放| 国产亚洲人成网站在线观看| 日韩中文字幕欧美| 久久这里只有精品视频首页| 亚洲伊人一本大道中文字幕| 成人国产精品免费视频| 91精品视频专区|