版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C++String部分成員模擬實現(xiàn)流程詳解目錄string類的成員設(shè)計普通構(gòu)造函數(shù)的模擬拷貝構(gòu)造函數(shù)的模擬賦值重載函數(shù)的模擬String的析構(gòu)函數(shù)模擬補全上述的成員函數(shù)迭代器的簡單模擬其他成員函數(shù)的模擬
string類的成員設(shè)計
classstring
private:
char*_str;
int_size;
int_capacity;
說明:以下的五個成員函數(shù)的模擬實現(xiàn),均去除了_size和_capacity成員變量,目的是為了更方便解釋重點。在五個成員函數(shù)模擬后,會對string類的設(shè)計進(jìn)行補全。
普通構(gòu)造函數(shù)的模擬
我們是否可以使用默認(rèn)構(gòu)造函數(shù)來初始化對象?在這種情況下是萬萬不能的!要記住默認(rèn)的構(gòu)造函數(shù)對自定義類型會去調(diào)用它自己的構(gòu)造函數(shù)進(jìn)行初始化,而對于內(nèi)置類型是不做處理的,此時我們的成員變量_str的類型是內(nèi)置類型,不會被初始化,所以一定要自己寫構(gòu)造函數(shù)。
//這種構(gòu)造函數(shù)是否可行?
string(constchar*str)
_str=str;
這種寫法做不到用字符串構(gòu)造一個對象。
原因:這樣會使得str和_str指向的都是同一塊空間。str會影響到_str.
所以正確的做法是,給_str分配一塊屬于自己的空間,再把str的值拷貝給_str.
string(constchar*str)
_str=newchar[strlen(str)+1];//要多給一個'\0'的空間
strcpy(_str,str);
修一下小細(xì)節(jié):
1.實例化對象的時候是支持無參構(gòu)造的,所以可以給參數(shù)一個缺省值,里面自己隱藏的有一個\0.如果沒有傳參數(shù),則使用缺省值。
string(constchar*str="")
_str=newchar[strlen(str)+1];//要多給一個'\0'的空間
strcpy(_str,str);
拷貝構(gòu)造函數(shù)的模擬
看了普通構(gòu)造函數(shù)的模擬實現(xiàn)以后,最不應(yīng)該犯的錯就是把一個string對象的數(shù)據(jù)直接給了另一個string對象
所以直接甩代碼
string(conststrings)
_str=newchar[strlen(s._str)+1];
strcpy(_str,s._str);
}
當(dāng)然,如果有前面所寫普通構(gòu)造函數(shù),還可以利用普通構(gòu)造函數(shù)來拷貝構(gòu)造一個對象。
//還可以借助普通構(gòu)造函數(shù)
string(conststrings)
:_str(nullptr)
stringtmp(s._str);
swap(_str,tmp._str);
}
賦值重載函數(shù)的模擬
這里重載賦值,是為了把一個已經(jīng)存在的string對象的數(shù)據(jù)給另一個已經(jīng)存在的string對象。
也就意味著,兩個對象均有自己的空間。不要把string對象的_str直接賦值,否則析構(gòu)的時候會析構(gòu)兩次,并且這兩個string對象由于_str使用的是同一塊空間,會相互之間影響。
stringoperator=(conststrings)
delete[]_str;//把原來的空間釋放掉
_str=newchar[strlen(s._str)+1];//給一塊新的空間
strcpy(_str,s._str);;
上面這種方法是不行的。
1.不排除自己給自己賦值的情況,自己都給釋放了,拿什么來賦值?
2.使用delete先釋放,只要地址正確無論如何都會釋放成功,但是new一塊空間不一定會成功,如果一開始就給釋放了,而我去申請空間卻申請不到,那就是不僅沒有賦值成功,還把我自己原本有的給丟了。
//正確的寫法
stringoperator=(conststrings)
if(this!=s)
char*tmp=newchar[strlen(s._str)+1];
strcpy(tmp,s._str);
delete[]_str;
_str=tmp;
return*this;//如果自己給自己賦值,那就返回自己
}
還可以使用傳值的方法
stringoperator=(strings)
swap(_str,s._str);
return*this;
String的析構(gòu)函數(shù)模擬
~string()
if(_str)
delete[]_str;
_str=nullptr;
補全上述的成員函數(shù)
//因為std庫里原本有一個string,所以這里加上一個命名空間,防止命名污染
namespaceYDY
classstring
public:
string(constchar*str="")
:_size(strlen(str))
,_capacity(_size)
_str=newchar[_capacity+1];//要多給一個'\0'的空間
strcpy(_str,str);
string(conststrings)
:_str(nullptr)
,_size(s._size)
,_capacity(s._capacity)
stringtmp(s._str);
swap(_str,tmp._str);
stringoperator=(conststrings)
if(this!=s)
char*tmp=newchar[strlen(s._str)+1];
strcpy(tmp,s._str);
delete[]_str;
_str=tmp;
_size=s._size;
_capacity=s._capacity;
return*this;
~string()
if(_str)
delete[]_str;
_str=nullptr;
_size=_capacity=0;
private:
char*_str;
int_size;
int_capacity;
voidtest()
strings1;
strings2(s1);
strings3=s1;
}
迭代器的簡單模擬
typedefchar*iterator;
typedefconstchar*const_iterator;
iteratorbegin()
return_str;
iteratorend()
return_str+_size;
const_iteratorbegin()const
return_str;
const_iteratorend()const
return_str+_size;
}
其他成員函數(shù)的模擬
constchar*c_str()
return_str;
size_tsize()
return_size;
charoperator[](size_tpos)
assert(pos_size);
return_str[pos];
constcharoperator[](size_tpos)const
assert(pos_size);
return_str[pos];
//reserve
voidreserve(size_tn)
if(n_capacity)
//擴(kuò)容到n+1
//tmp是內(nèi)置類型,
char*tmp=newchar[n+1];
strcpy(tmp,_str);
delete[]_str;
_str=tmp;
_capacity=n;
voidpush_back(charc)
//空間不夠,擴(kuò)容
if(_size==_capacity)
//擴(kuò)容
reserve(_size+1);
_str[_size]=c;
_size++;
_str[_size]='\0';
voidappend(constchar*str)
intlen=strlen(str);
if(_size+len_capacity)
//增容
reserve(_size+len);
strcpy(_str+_size,str);
_size+=len;
stringoperator+=(charch)
push_back(ch);
return*this;
stringoperator+=(constchar*str)
//復(fù)用追加函數(shù)append()
append(str);
return*this;
//任意位置的插入
stringinsert(size_tpos,charch)
if(_size==_capacity)
reserve(_size+1);
//開始插入
intend=_size+1;
//找到pos的位置,并留出pos的位置以便插入
while(endpos)
_str[end]=_str[end-1];
end--;
_str[pos]=ch;
_size++;
return*this;
stringinsert(size_tpos,constchar*str)
assert(pos_size);
size_tlen=strlen(str);
if(_size+len_capacity)
//增容
reserve(_size+len);
//找到pos的位置,并且留出要插入的位置
size_tend=_size+len;
while(endpos)
_str[end]=_str[end-len];
end--;
//開始插入
strncpy(_str+pos,str,len);
return*this;
//從pos的位置開始刪除len的長度
stringerase(s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融普惠與AI技術(shù)融合路徑
- 2026山東濟(jì)南高新區(qū)龍奧大廈附近小學(xué)招聘派遣制小學(xué)數(shù)學(xué)代課老師1人備考題庫帶答案詳解(考試直接用)
- 2026云南保山市天立學(xué)校后勤員工招聘備考題庫帶答案詳解(b卷)
- 2026廣東廣州花都區(qū)秀全街九潭初級中學(xué)臨聘教師招聘1人備考題庫附答案詳解(綜合題)
- 2026中國海峽人才市場南平工作部招聘見習(xí)生備考題庫附答案詳解(培優(yōu))
- 2026廣東河源市連平縣招聘臨聘教師16人備考題庫及1套參考答案詳解
- 2026國檢測試控股集團(tuán)內(nèi)蒙古京誠檢測有限公司招聘備考題庫附參考答案詳解ab卷
- 2026云南昭通永善縣政務(wù)服務(wù)管理局招聘1人備考題庫帶答案詳解(輕巧奪冠)
- 2025年注冊測繪師考試題庫及參考答案解析
- 病案管理質(zhì)量管理制度
- T-CCTAS 237-2025 城市軌道交通市域快線車輛運營技術(shù)規(guī)范
- 園林環(huán)衛(wèi)安全培訓(xùn)內(nèi)容課件
- 軟件系統(tǒng)上線測試與驗收報告
- 冬季交通安全測試題及答案解析
- 2025年國家能源局系統(tǒng)公務(wù)員面試模擬題及備考指南
- (2025年標(biāo)準(zhǔn))圈內(nèi)認(rèn)主協(xié)議書
- 2025年安徽省中考化學(xué)真題及答案
- 2025年軍隊文職人員統(tǒng)一招聘面試( 臨床醫(yī)學(xué))題庫附答案
- 海馬體核磁掃描課件
- 某電力股份企業(yè)同熱三期2×100萬千瓦項目環(huán)評報告書
- 2026屆上海市部分區(qū)中考一模語文試題含解析
評論
0/150
提交評論