C++String部分成員模擬實現(xiàn)流程詳解_第1頁
C++String部分成員模擬實現(xiàn)流程詳解_第2頁
C++String部分成員模擬實現(xiàn)流程詳解_第3頁
C++String部分成員模擬實現(xiàn)流程詳解_第4頁
C++String部分成員模擬實現(xiàn)流程詳解_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論