Prototype(原型)是什麼:
只定義函式名稱和傳入的參數(shù),不寫函式執(zhí)行的內(nèi)容。
class中定義prototype的例子:
以下是一個node類別,有2個屬性,整數(shù)no和node類型的指標(biāo)變數(shù)。
class node{
int no;
node *ptr;
public:
int readA(); // 執(zhí)行的程式碼寫在類別的外面
void writeA(int); // 只定義了參數(shù)的資料型態(tài),名稱可以不用寫
...
};
readA()和writeA(int)就可以說是prototype。
原型就像在封面頁上寫了「數(shù)學(xué)」的空白筆記本,
打算要拿來寫數(shù)學(xué)筆記,但是裡面還是一片空白的概念。
為什麼要這麼做?
1. 整個函式的內(nèi)容可能超級多,全部寫出來不易讀,也不好找到想要看的函式。
2. c++必須先宣告函式,才能呼叫函式,也就是最先用到的函式必須寫在最上面,按照順序?qū)懴聛怼?/font>
有了prototype以後,就可以實現(xiàn)函式自由,你愛寫哪就寫哪,寫在main(){}底下也沒差。
這邊就要說一下,Dart本來就可以把函式宣告、定義在呼叫函式之下,好爽。
可以在class外面才定義類別的方法內(nèi)容,也可以寫在類別裡面。
在class外面定義的語法:
回傳值型態(tài) 類別名稱::函式名稱(){方法內(nèi)容}
回傳值型態(tài) 類別名稱::函式名稱(){方法內(nèi)容}
int node::readA(){
return no;
}
void node::writeA(int a) { // int a 這裡寫了參數(shù)名稱,原型中沒寫
no = a;
}
constructor 建構(gòu)子是什麼?
在類別中跟類別名稱一樣的方法。
用來初始化,當(dāng)類別物件被建立的時候自動執(zhí)行。
沒有parameter(參數(shù))的建構(gòu)子,稱為defult constructor。
class中裡面一定要有一個一個constructor。
如果沒有建立建構(gòu)子,系統(tǒng)會自動建立一個,不會執(zhí)行任何動作的建構(gòu)子(空的函式)。
早期C++不能寫int no = 0;
宣告跟寫入是兩回事,因為還沒建立no物件,無法寫入值。
所以需要建構(gòu)子,在類別定義完、物件產(chǎn)生以後,寫入初始值。
但現(xiàn)在int no = 0;是合法的了。
Destructor 解構(gòu)子
在類別中函式名稱為 ~類別名稱() 的方法。
物件被消滅的時候執(zhí)行的內(nèi)容,
沒有建立的話,系統(tǒng)也會自動建立。
動態(tài)記憶體配置:程式執(zhí)行ing才跟電腦索取記憶體
新增指令: new
刪除指令:delete
動態(tài)新增整數(shù)例子:
int *p = new int;
分2行的寫法:
int *p;
p = new int;
函式多載:允許相同名稱的函式存在
但是參數(shù)列內(nèi)的參數(shù)數(shù)量必須不一樣 ok!
或資料型態(tài)不一樣 ok!
或參數(shù)數(shù)量一樣,但對應(yīng)的位置的資料型態(tài)不一樣 ok!
int f(int, float);
int f(float, int);
這兩個函式f()可以多載!
運算子多載:重新定義運算子的函式,用於自訂的資料型態(tài)。
有兩種寫法:
方法1. 寫在class外面
定義兩個node類別相加
int operator+(node &p, node &q){ // operator+
return(p.getNo()+q.getNo());
}
&p和&q的意義:參數(shù)列中變數(shù)前面加&,代表傳參考,傳進來的是node物件,在函式中的以別名p,q代稱
函式內(nèi)容:把p跟q物件的no值相加後回傳
回傳( 用p物件中的getNo()方法,讀取p物件no的值,加上,用p物件中的getNo()方法,讀取q物件中的no的值 )
回傳( 用p物件中的getNo()方法,讀取p物件no的值,加上,用p物件中的getNo()方法,讀取q物件中的no的值 )
呼叫函式:
cout << "*" << (*head)+(*t) << endl; // operator+
因為是動態(tài)記憶體配置,所以傳入的是指標(biāo),指向物件的位址
方法2. 寫在class裡面,代表每個物件都內(nèi)建-這個函式
class node() {
…
…
public:
…
int operator-(node &p) {return no+p.no}
}
函式內(nèi)容:自己的no值和傳入的p物件的no值相加。
重新定義了減號,雖然是減號但是裡面的函式可以任意改變,這裡就是用減號執(zhí)行相加的運算。
呼叫函式:
cout << "*" << (*head)-(*t) << endl; // operator-
注意:雖然-函式只要求傳入1個參數(shù),但是呼叫時還是要寫出2個運算元(要計算的東西)。
第1個運算元(*head)是呼叫-的物件,第2個(*t)是傳入(*head)物件-方法的參數(shù)p。
(*head)中的-方法會把(*head)的no值,和(*t)的no值相加後回傳。