定義類別

文章推薦指數: 80 %
投票人數:10人

從C 背景來的開發者可能會想,這種風格像是C 的結構(struct),在C++ 中, struct 也被視為定義類別,將以上的 class 關鍵字換為 struct ,程式也可以運作, struct ... 回C++目錄 有些資料會有相關性,相關聯的資料組織在一起,對於資料本身的可用性或者是程式碼的可讀性,都會有所幫助,例如,在程式中你可能發現,在進行帳戶之類的處理時,帳號、名稱、餘額這三個資料總是一併出現的,這時可以將它們組織在一起,定義為類別: account.h #include usingnamespacestd; classAccount{ public: stringid; stringname; doublebalance; }; 在檔頭檔中定義類別,表頭檔案的名稱建議與類別名稱同名,class是定義類別的關鍵字,Account是類別名稱,public表示定義的id、name與balance值域(field),都是可以公開存取的。

例如: main.cpp #include #include"account.h" voidprintAcct(Account*acct){ cout<id<name<balance<id="789-654-321"; acct2->name="MonicaHuang"; acct2->balance=1000; printAcct(acct2); deleteacct2; return0; } Accountacct1建立了Account的實例,這時acct1在函式執行完畢後就會自動清除,存取實例的值域時可以使用dot運算子「.」。

若是Accountacct=acct1這類指定,會將acct1的值域複製給acct,若Account的值域佔用了許多資源,複製會造成負擔的話,可以透過參考或指標來避免複製的動作,例如printAcct(acct1)運用的就是參考。

可以使用new來動態建構Account的實例,動態建立的實例不需要時要使用delete清除,透過指標存取實例成員時,要使用箭號運算子「->」。

從C背景來的開發者可能會想,這種風格像是C的結構(struct),在C++中,struct也被視為定義類別,將以上的class關鍵字換為struct,程式也可以運作,struct與class的差別在於,前者在第一個權限可見的修飾詞出現前(例如public、private),定義的成員預設會是公開可存取,而後者預設會是私有(也就是private)。

執行結果如下: Account(123-456-789,JustinLin,1000) Account(789-654-321,MonicaHuang,1000) 在方才的範例中,初始Account值域的流程,其實是重複了,若要消彌這類重複,可以定義建構式(constructor),例如: account.h #include usingnamespacestd; classAccount{ public: Account(stringid,stringname,doublebalance); stringid; stringname; doublebalance; }; 在標頭檔的建構式定義中,定義了建構實例時,需要帳號、名稱、餘額這三個資料,接下來將方才的初始流程重構至建構式的實作: account.cpp #include #include"account.h" usingnamespacestd; Account::Account(stringid,stringname,doublebalance){ this->id=id; this->name=name; this->balance=balance; } ::是類別範圍解析(classscoperesolution)運算子,在實作類別建構式或方法(method)時,在::前指明實作哪類別之定義。

如果沒有定義任何建構式,編譯器會自動產生沒有參數的預設建構式,如果自定義了建構式,就會使用你定義的建構式,在建構式或方法的實作中,若要存取實例本身,可以透過this,這是個指標,因此要透過箭號運算子來存取值域。

現在可以如下寫個程式來使用Account類別: main.cpp #include #include #include"account.h" stringto_string(Account&acct){ returnstring("Account(")+ acct.id+","+ acct.name+","+ std::to_string(acct.balance)+")"; } voiddeposit(Account&acct,doubleamount){ if(amount<=0){ cout<acct.balance){ cout< usingnamespacestd; classAccount{ private: stringid; stringname; doublebalance; public: Account(stringid,stringname,doublebalance); voiddeposit(doubleamount); voidwithdraw(doubleamount); stringto_string(); }; 以上只定義了方法的簽署,也可以選擇在類別中同時實作方法,這類方法預設是inline的,選擇在類別之外實作方法時,則可以明確地指定inline。

現在to_string、deposit、withdraw被定義為Account的方法了,也稱為成員函式(memberfunction),因為實作時,可以透過this來存取實例,就不用在方法上定義接受Account的參數了,而原本的id、name、balance被放到了private區段,這是因為不想被公開存取,也就只能被建構式或方法存取,這麼一來,就可以定義更動這些值域的流程。

實際上,private在這邊是不需要的,如前頭談過的,以class定義類別時,在第一個權限可見的修飾詞出現前,定義的成員預設會是私有。

account.cpp #include #include #include"account.h" usingnamespacestd; Account::Account(stringid,stringname,doublebalance){ this->id=id; this->name=name; this->balance=balance; } stringAccount::to_string(){ returnstring("Account(")+ this->id+","+ this->name+","+ std::to_string(this->balance)+")"; } voidAccount::deposit(doubleamount){ if(amount<=0){ cout<balance+=amount; } voidAccount::withdraw(doubleamount){ if(amount>this->balance){ cout<balance-=amount; } 接下來要使用Account就簡單多了: #include #include #include"account.h" intmain(){ Accountacct={"123-456-789","JustinLin",1000}; cout<



請為這篇文章評分?