MyString類的實現 基礎中的基礎C語言

2022-03-25 03:05:23 字數 2308 閱讀 8306

mystring 類是學習 c++ 的過程中乙個很重要的例子,涉及到物件導向的封裝、堆記憶體申請和釋放、函式的過載以及 c++ 的 「big three」。本例子重點在於複習和理解上述的 c++ 特性,實現的功能並不多。

mystring 的宣告中包含了乙個帶指標的 c++ 類應有的函式,並且包含了一些常用的功能。其中終點討論一下用friend關鍵字修飾的兩個函式,它們是用來提供ostream的輸出的。宣告為friend是為了使ostream的物件(例如 cout)可以訪問到 mystring 的成員。而這兩個函式不宣告為內部方法的原因是我們一般寫輸入輸出語句都是將流物件寫在前,如果宣告成了成員函式則呼叫的時候要寫成這樣:

mystring str;

str.operator<<(cout);

這看起來相當怪異,所以我們希望寫成cout << str這樣。這句實際上就是 cout 物件呼叫過載的運算子,也可以寫在例項化 cout 物件的類 ostream 裡,但是 ostream 一般來說我們並不會去改動這個檔案,所以寫了乙個全域性函式來將 ostream 和 mystring 聯絡起來。

class mystring 

// operator reload

mystring &operator+(const mystring &str);

bool operator==(const mystring &str);

size_t length() const;

private:

char *m_data;

};

c++ 的 big three 包括拷貝賦值、拷貝構造和析構函式。big three 主要針對帶有指標的類,類中的指標一般指向類所管理的一些資源,可能是該類自己申請的記憶體或者建立的某種物件。類維護著這些資源,負責它們的生老病死——資源的建立、使用和銷毀。

乙個類中如果帶有著指標,那麼必須要自己重寫有拷貝構造和拷貝賦值函式。如果不自己重寫,那麼會採取預設的行為,即逐位拷貝。採取逐位拷貝的物件內部的指標也被拷貝過去,稱為淺拷貝。我們希望拷貝乙個物件,其管理的資源也一併拷貝乙份,稱為深拷貝。為了實現深拷貝,重寫的拷貝賦值、拷貝建構函式中應實現資源複製的行為。而在物件生命週期結束後,其管理的資源也應該關閉或者銷毀,故也需要重寫析構函式。

c++ 的這三個函式緊密地聯絡在了一起,具體體現為邏輯上如果需要重寫其中任何乙個函式,那麼另外兩個函式也應該被重寫

inline

mystring::mystring(const char *cstr = nullptr)

else

}inline

mystring::~mystring()

inline

mystring::mystring(const mystring &str)

inline

mystring &mystring::operator=(const mystring &str)

在上面的實現中,有兩個值得注意的地方,乙個是在拷貝賦值運算子過載中的自賦值檢查,在拷貝賦值運算子函式中,如果不進行檢查,按照邏輯來說,會釋放被賦值物件的資源,如果是同乙個物件的自我賦值,則會產生嚴重的後果:字串資源被刪除,兩個物件指向被**了的記憶體,當訪問這個字串時會出現不可預料的後果。可見,防禦式程式設計不僅要求程式對黑客行為的輸入的那些很離譜的資料做防禦,還要對使用者可能出現的錯誤進行防禦。

另外乙個值得注意的地方就是過載的等於操作符,使用者在使用的時候有時可能會對字串連續賦值,就像使用 cout 連續輸出一樣,這種類似於函式的鏈式呼叫。實現的時候只要返回物件的引用就可以了。

除了鏈式呼叫需要返回物件引用的這個主意點外,輸入輸出函式的第二個引數的 const 屬性也應該主意的。具體來說輸出函式的第二個引數不會被改變,我們應該將它宣告為 const 的;而輸入函式的第二個物件正是我們希望改變的物件,希望將資料輸入到這個物件中,它應該是非 const 引用。

std::ostream &operator<<(std::ostream &os, const mystring &str) 

std::ostream &operator>>(std::ostream &os, mystring &str)

至此乙個非常簡單的 c++ mystring 類已經實現完成了,在 stl 中,string 類的實現更加複雜,包括了正則在內的高階功能。這個例子僅僅為了學習 c++ 的一些特性,還不夠深入,希望未來能專門研究一下 string 的實現。

mystring類的實現

ifndef cmystring h define cmystring h include include class cmystring data new char strlen s 1 strcpy data,s copy ctor cmystring const cmystring other...

string類的實現(mystring)

最近參加了實習招聘感覺自己的c 都快忘光了,其中面試過程中問到了string類的實現,需手寫實現一遍。現在再實現一下 class mystring inline mystring mystring char str null else inline mystring mystring inline ...

C 之實現MyString類

1.mystring.h pragma once include using namespace std class mystring 2.mystring.cpp include mystring.h 建構函式 mystring mystring const char str else 拷貝建構函...