Qt图形界面编程入门(1)
一、類和對(duì)象
1,面向過(guò)程程序設(shè)計(jì)(自頂向下設(shè)計(jì))
分析出解決問(wèn)題所需的步驟,然后用函數(shù)把這些步驟一一實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)調(diào)用
過(guò)程式設(shè)計(jì)對(duì)于比較復(fù)雜的問(wèn)題,或是在開(kāi)發(fā)中需求變化比較多的時(shí)候,往往顯示力不從心
·? 這是因?yàn)檫^(guò)程式的設(shè)計(jì)是自上而下的,這要求設(shè)計(jì)者在一開(kāi)始就要對(duì)需要解決的問(wèn)題有一定的了解。在問(wèn)題比較復(fù)雜的社會(huì),要做到做一點(diǎn)會(huì)比較困難。
·? 開(kāi)發(fā)一個(gè)系統(tǒng)的過(guò)程往往也是一個(gè)對(duì)系統(tǒng)不斷了解和學(xué)習(xí)的過(guò)程,而過(guò)程式的設(shè)計(jì)方法忽略了這一點(diǎn)。
·? 過(guò)程式設(shè)計(jì)使用函數(shù)定義操作;使用變量定義事物的屬性、特征;這樣做的結(jié)果是數(shù)據(jù)和操作被分離。
·? 比如go()函數(shù)表示汽車前進(jìn),而汽車的排量、燃料種類等等都是和go()函數(shù)分離的。
·? 數(shù)據(jù)和操作被分離,容易導(dǎo)致對(duì)一種數(shù)據(jù)的操作分布在整個(gè)數(shù)據(jù)的各個(gè)角落,從而造成系統(tǒng)維護(hù)困難。系統(tǒng)越大情況越糟糕。
2,面向?qū)ο蟪绦蛟O(shè)計(jì)
·? 面向?qū)ο髲膯?wèn)題的一部分入手,把構(gòu)成問(wèn)題的事物分解成許多對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描述某個(gè)事物自身及其在整個(gè)解決問(wèn)題的過(guò)程中的行為。
·? C++語(yǔ)言中,對(duì)象抽象成類,類成為模塊化元素,是劃分程序的基本單位。
·? 類將對(duì)象的數(shù)據(jù)和操作(成員函數(shù))封裝在一起,可以說(shuō)這就是對(duì)象設(shè)計(jì)方法最基本的特征。
問(wèn)題:
現(xiàn)在將一批鴨子用若干個(gè)盒子包裝起來(lái)。將這一過(guò)程用程序表現(xiàn)出來(lái)。
面向過(guò)程的設(shè)計(jì)方法:
涉及到三個(gè)操作,對(duì)應(yīng)三個(gè)函數(shù):
? ①open() 把盒子打開(kāi),目標(biāo)是得到打開(kāi)的盒子
? ②put()把鴨子裝進(jìn)去,目標(biāo)是得到里面裝著鴨子的盒子
? ③close()把盒子蓋好,目標(biāo)是獲得蓋好盒蓋的有鴨子的盒子
定義問(wèn)題中的數(shù)據(jù):
用數(shù)字state[]表示盒子的狀態(tài),state[k]表示第k個(gè)盒子的情況。可將盒子狀態(tài)分為4種情況(用0-3表示):
0-----未開(kāi)蓋的空盒
1------開(kāi)蓋的空盒
2-------裝好鴨子、未蓋好蓋子的盒子
3-------裝好鴨子并蓋好蓋子的盒子
用duckState[] 表示鴨子的狀態(tài),duckState[n]表示第n只鴨子的情況。
鴨子的狀態(tài)是未被裝入和已被裝入兩種,因此可以用bool類型數(shù)組表示。
int open(int state[],int k)打開(kāi)第k個(gè)盒子,成功返回編號(hào),失敗返回-1
int put(int state[],int k,bool duckState[],n)將第n只鴨子放入第k個(gè)盒子,成功則返回盒子編號(hào),失敗返回-1
void close(int state[],int k)將第k個(gè)盒子蓋好
至此,三個(gè)步驟都用函數(shù)實(shí)現(xiàn)了,感覺(jué)還行,下面我們看看面向?qū)ο蟮姆椒?/p>
面向?qū)ο蟮姆治鲈O(shè)計(jì)方式
面向?qū)ο蟮姆椒?strong>不是從“怎么做”出發(fā),而是從“是什么”出發(fā)考慮問(wèn)題。首先尋找問(wèn)題中的對(duì)象。為了發(fā)現(xiàn)對(duì)象,要在系統(tǒng)說(shuō)明的文檔中查找名詞。
在問(wèn)題中,我們可以找到重要的名詞:盒子,鴨子
然后將這些對(duì)象的共有特性以及其責(zé)任抽象稱為特殊的數(shù)據(jù)類型------類
在C++中,類用class定義
考察盒子對(duì)象,顯然“狀態(tài)”是盒子的屬性,可以把“將鴨子放入盒子中”歸納為盒子的任務(wù)。
為了完成把鴨子裝進(jìn)盒子的任務(wù),需要做三個(gè)動(dòng)作:
打開(kāi)蓋子,裝入,合上蓋子。每個(gè)導(dǎo)致對(duì)應(yīng)類的一個(gè)成員函數(shù)。
這樣一來(lái),我們要做的是對(duì)某個(gè)盒子發(fā)出指令:
①k號(hào)盒子,請(qǐng)把蓋子打開(kāi)
②k號(hào)盒子,請(qǐng)把第n只鴨子放入
③k號(hào)盒子,請(qǐng)把蓋子蓋上
每個(gè)指令計(jì)算調(diào)用一個(gè)成員函數(shù)。
盒子類可定義如下:
class BOX{int ID; //盒子編號(hào),為什么不是數(shù)組?int state; //盒子狀態(tài),為什么不是數(shù)組?int open(); //打開(kāi)盒子,為什么沒(méi)有參數(shù)?int put(bool duckState[],n); //將第n只放入盒子void close(); //將蓋子蓋好,為什么沒(méi)有參數(shù)? }放入物品的過(guò)程中盒子b[k]應(yīng)當(dāng)執(zhí)行如下代碼:
b[k].open() b[k].put(duckState,n); b[k].close()·? 在面向過(guò)程的方法中,數(shù)據(jù)和函數(shù)是分離的,數(shù)據(jù)可能散落在程序的各個(gè)角落,不易維護(hù);
?? 而面向?qū)ο蟮姆椒ㄖ?#xff0c;函數(shù)和數(shù)據(jù)結(jié)合在一起,每個(gè)對(duì)象都有自己獨(dú)立的數(shù)據(jù),含義清晰,易于維護(hù)。
·? 在面向過(guò)程方法過(guò)程中,需要在開(kāi)始階段就分析清楚每個(gè)過(guò)程的作用,并編寫(xiě)合適的函數(shù),一旦在后續(xù)工作中發(fā)現(xiàn)初始的分析不恰當(dāng),則可能改動(dòng)很大;而面向?qū)ο蟮脑O(shè)計(jì)方法允許開(kāi)發(fā)者從問(wèn)題的局部開(kāi)始,先找出類,在找出類之間的關(guān)系,在開(kāi)發(fā)過(guò)程中逐步加深對(duì)系統(tǒng)的理解
如何聲明一個(gè)類
class 類名? // class是聲明類的關(guān)鍵字
{
private:
//私有成員數(shù)據(jù)(屬性)和私有成員函數(shù)(方法)
protected:
//保護(hù)成員數(shù)據(jù)(屬性)和保護(hù)成員函數(shù)(方法)
public:
//公有成員數(shù)據(jù)(屬性)和公有成員函數(shù)(方法)
};
//花括號(hào)內(nèi)部分是類體。類聲明以分號(hào)結(jié)尾。
聲明一個(gè)銀行賬戶類
class Account { public: // 公有成員int ID // 賬戶IDchar Name[20]; //姓名float balance; //余額int withdraw(float m) //取出數(shù)量為m的錢{if(balance > m){balance = balance - m; return 1;}else return -1;}void deposits(float m); }; void Account::deposits(float m){ //在類內(nèi)部或外部實(shí)現(xiàn)函數(shù)都可balance = balance + m; }聲明具體對(duì)象或?qū)ο髷?shù)組
正如“人”是抽象的定義,生活的舞臺(tái)都是具體等等張三,李四在表演;
“賬戶”類也是抽象的,只有定義了具體賬戶,才能執(zhí)行某些操作。
定義一個(gè)賬戶對(duì)象:
Account my Account;
而下面語(yǔ)句則定義了包含10個(gè)對(duì)象的數(shù)組:
Account account[10]
不論是定義一個(gè)對(duì)象,還是一組對(duì)象,C++都會(huì)在內(nèi)存中為每一個(gè)對(duì)象分配必要的空間
公有函數(shù)的使用方法
格式:
對(duì)象名.函數(shù)名(實(shí)際參數(shù))
比如,要向myAccount存入600元,格式如下:
myAccount.deposit(600.0)注意:僅僅對(duì)公有函數(shù)可以這樣使用
類對(duì)象的公有變量也直接修改或顯示。比如:
myAccount.ID = 10001; //設(shè)定賬戶ID同類對(duì)象之間可以賦值比如下面的語(yǔ)句:
myAccount = account[0];·? 類也可以作為一個(gè)函數(shù)的參數(shù)或返回值出現(xiàn),下面定義一個(gè)不屬于任何類的函數(shù):
//從賬戶A轉(zhuǎn)m元到賬戶B bool transfer(Account A , Account B, float m){if(A.withdraw(m) == 1){ //若A取款成功B.deposits(m); //向B存款return true;}else return false; }注意:調(diào)用函數(shù):
transfer(myAccount,account[0],1000.0);
不會(huì)修改myAccount和account[0]對(duì)象的數(shù)值!
原理:
·? 雖然函數(shù)中A和B出現(xiàn)在參數(shù)中,不是在transfer函數(shù)體內(nèi)定義,但A和B仍是此函數(shù)內(nèi)部的局部變量
·? 對(duì)象myAccount和account[0]分別賦值給A和B(值傳遞)。這里myAccount和account[0]都是彼此獨(dú)立的對(duì)象
·? 在函數(shù)中從賬戶A轉(zhuǎn)m元到賬戶B。但是myAccount和account[0]對(duì)象無(wú)任何變化
·? 函數(shù)transfer執(zhí)行完畢后,其中的局部變量A和B也隨之消失。
解決本問(wèn)題需要利用指針或引用
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Qt图形界面编程入门(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL学习(2)
- 下一篇: 如何制定一家三口的早餐计划?都有哪些种类