ETH官方钱包

前往
大廳
主題

【程式筆記】0320 C++物件導(dǎo)向程式設(shè)計

乂巧天琴乂 | 2024-03-20 16:24:53 | 巴幣 1010 | 人氣 215

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本來就可以把函式宣告、定義在呼叫函式之下,好爽。

那方法(筆記內(nèi)容)到底要寫在哪裡?
可以在class外面才定義類別的方法內(nèi)容,也可以寫在類別裡面。

在class外面定義的語法:
回傳值型態(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的值 )

呼叫函式:
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值相加後回傳。

送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

北之夜玥
原型(Prototype)、建構(gòu)子(Constructor)、解構(gòu)子(Destructor)、動態(tài)記憶體配置以及運算子多載(Operator Overloading)等概念的詳細解釋都是C++程式設(shè)計的重要基礎(chǔ)概念。說明清晰易懂,範(fàn)例也很貼切對於剛學(xué)習(xí)C++的應(yīng)該會有很大的幫助
2024-03-22 01:32:19
乂巧天琴乂
謝謝你 GPT 我的超人
2024-03-22 15:49:47
幽雨
舉個例子來說,以"形狀Shape"為Prototype,內(nèi)容有"周長、面積"變數(shù),以及計算這兩者的函數(shù),現(xiàn)在有長方形、圓形、三角形三種形狀可以繼承Shape的內(nèi)容,在每種形狀內(nèi)又可以各自O(shè)verloading自定義函數(shù)內(nèi)容。我是這麼理解的,文章寫得不錯,推。
2024-06-07 13:33:57
川普的ㄐㄐ
運算子的多載 很多細節(jié)。尤其是 = (assign)
https://www.geeksforgeeks.org/cpp-assignment-operator-overloading/https://truth.bahamut.com.tw/s01/202407/f8d1c82320f1ee34445f442e56dd4bef.JPG
2024-07-07 16:08:40
川普的ㄐㄐ
https://www.geeksforgeeks.org/cpp-assignment-operator-overloading/
2024-07-07 16:08:53
川普的ㄐㄐ
https://truth.bahamut.com.tw/s01/202407/e7bc463711c85964057074f9f9b3c4d9.JPG
2024-07-07 16:09:06

更多創(chuàng)作