我我我要學c++!
可是我我我只會c。。
所以,這篇筆記從乙個c初學者的角度。。。試著理解c++(他在狂笑)概念
所以為什麼要有物件導向程式設計?
當然,我們寫乙個hello world算乙個2*3是不需要物件導向的,但是當軟體年得越來越大,越來越多的**量的時候。。問題就來了:
舉個例子,我要做fifa遊戲,額這個遊戲已經足夠大了對吧,這是我們就遇到了很多傳統面向過程程式設計的問題:
開始實現
開始用c++實現物件導向
下面借鑑清華大學出版社《c++物件導向程式設計》裡面的案例來闡釋c++裡面的一些語法特性
#include
#include
#define min 10
#define maxitem 5
using namespace std;
class cargo
;float
calccharge()
;char
*getowner()
;float
getweight()
;char
*getdestination()
;char
*getcontent()
;float
getcharge()
;};
這就是乙個基本的貨物類的創立;
一如c裡面的結構體定義只是確定資料型別,但是編譯器並不會為你設定的類留出記憶體空間,只有你在main函式裡面定義乙個cargo類的物件時才會分配記憶體。我們可以在類外用乙個完全新的方法來專門給所有的成員賦值。就像這樣:
void cargo::init(char *owner,float weight,char *destination,char *content)
其中的雙冒號::是類作用域符。我們在類裡面定義了某方法,但要是在類裡面全部實現方法,未免會破壞類定義的完整性(比如我把定義和方法內容寫一塊,就會導致我在類裡面就寫了很長一串,然後其他方法的定義就湮滅在密密麻麻的**裡面了),於是c++提供了::來擴大類的作用域,讓我們可以在類外繼續實現方法。
但是這樣做依然有瑕疵。這需要我們在每次建立物件的時候都要呼叫init函式。一旦忘記了就會導致資料未初始化而無法預知結果。
c++為我們提供了一種叫做建構函式的東西,可以在每次建立物件時自動呼叫。
就像這樣:
(將前面類定義的注釋給去掉)
建構函式的函式名與類名相同,具體實現建構函式的時候不帶任何返回型別,包括void也不用。
其中的cargo是基於一種對稱思想出現的。有初始化成員的就會有自動釋放結束生命歷程成員的函式,就是圖中的cargo函式。學名叫做析構函式。
class cargo
;public:
float
calccharge()
;char
*getowner()
;float
getweight()
;char
*getdestination()
;char
*getcontent()
;float
getcharge()
;};
之後我們依次實現上面定義好的方法
//初始化資料成員
cargo:
:cargo
(char
*owner,
float weight,
char
*destination,
char
*content)
// 計算貨物運費
float cargo:
:calccharge()
else
charge = rc + tw * chargerange[maxitem -1]
;return charge;}}
}
//取得貨物資訊:
char
*cargo:
:getowner()
char
*cargo:
:getdestination()
char
*cargo:
:getcontent()
float cargo:
:getcharge()
float cargo:
:getweight()
~aircargo()
;float
calcaircharge()
;int
getdangerlevel()
;char
*getusage()
;void
init
(char
*owner,
float weight,
char
*destination,
char
*content,
int dangerlevel,
char
*usage);}
;aircargo:
:aircargo
(char
*owner,
float weight,
char
*destination,
char
*content,
int dangerlevel,
char
*usage)
:cargo
(owner, weight, destination, content)
float aircargo:
:calcaircharge()
int aircargo:
:getdangerlevel()
char
*aircargo:
:getusage()
對**裡面的一些語法做一些說明:
1.class aircargo:public cargo就是乙個定義新類繼承的語法。表示aircargo是從cargo類繼承來的。關鍵字public是對原類成員訪問許可權在新類裡面的新闡釋。public、protect、private的訪問限定程度從小到大,定義繼承語句裡面的訪問限定符表示原成員在該訪問許可權限定程度及以上的許可權全部轉化為該許可權。
舉個例子,如果是private訪問區分符,在基類中的所有private成員任然是基類的private成員,在派生類中不能直接訪問積累中的這些private成員,基類所有的protect成員變成派生類的private成員,在派生類中可以直接訪問這些成員;基類所有的public成員變成派生類的private成員,在派生類中可以直接訪問這些成員。
2. 關於子類的建構函式
aircargo:
:aircargo
(char
*owner,
float weight,
char
*destination,
char
*content,
int dangerlevel,
char
*usage)
:cargo
(owner, weight, destination, content)
這一部分即為子類的建構函式。
子類一共有六個引數,其中有四個都是cargo類繼承得來的,用「:」+cargo(引數列表)來表示,新的兩個引數直接在類定義裡面賦值就是了(篇幅不長可以直接考慮在類裡面賦值或完成方法,以免在類外過於累贅)。
至此,我們就基本(強行)完成了乙個c++實現的管理系統了,主要是為了熟悉語法知識。
其他的高階概念。。我在後面的筆記添吧。。。。
我的C筆記(一)
計算機內資料的儲存是以二進位制數的補碼形式存在的。那麼什麼是補碼呢?這裡要涉及到二進位制數的原碼 反碼 補碼等儲存方式的概念。機器編碼 機器編碼有原碼 反碼 補碼 移碼 階碼等。原碼 原碼概念 計算機中所有的二進位制數均用0 1編碼表示,數字的正 負也不例外,如果乙個機器數字長是n的話,約定最左邊1...
我的C 筆記
1,map的key值是不能重複的,char 比較的是位址,所以認為key值相同,所以你只能插入乙個元素 若要用char 做key,需要過載操作符 t1,t2 也就是map的第三個引數,當然你用std string做key的話,可以不用過載這個操作符。2,char轉int char a 1 int b...
我的C 筆記
1,map的key值是不能重複的,char 比較的是位址,所以認為key值相同,所以你只能插入乙個元素 若要用char 做key,需要過載操作符 t1,t2 也就是map的第三個引數,當然你用std string做key的話,可以不用過載這個操作符。2,char轉int char a 1 int b...