足球機(jī)器人培訓(xùn)之C++_第1頁
足球機(jī)器人培訓(xùn)之C++_第2頁
足球機(jī)器人培訓(xùn)之C++_第3頁
足球機(jī)器人培訓(xùn)之C++_第4頁
足球機(jī)器人培訓(xùn)之C++_第5頁
已閱讀5頁,還剩177頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C+程序設(shè)計(jì)1C+語言簡介C+:C+之父- 貝爾實(shí)驗(yàn)室Bjarne StroustrupC+是更好的C2C+語言簡介 一、C+與C的關(guān)系 1、C+與C保持兼容 C+文件的后綴為.CPP2、C+對C語言作了一些擴(kuò)充和改進(jìn)3、C+增加了面向?qū)ο蟮臋C(jī)制 3怎樣學(xué)好程序設(shè)計(jì)語言程序=數(shù)據(jù)結(jié)構(gòu)+算法掌握語法:基本概念要清晰,基本語法要熟練掌握數(shù)據(jù)結(jié)構(gòu):把握如何將現(xiàn)實(shí)生活中的事物抽象為程序中數(shù)據(jù)結(jié)構(gòu)的方法掌握算法:學(xué)會(huì)如何規(guī)劃計(jì)算機(jī)的工作方式與順序的方法掌握編程思想:用計(jì)算機(jī)的思維方式去思維4學(xué)習(xí)C+C+是語法最復(fù)雜,功能最靈活的程序設(shè)計(jì)語言學(xué)習(xí)C+,一方面要注意C+與C在語法上的不同點(diǎn),更重要的是能從面

2、向過程式的思維方式轉(zhuǎn)向面向?qū)ο蟮乃季S方式。學(xué)C+,可以對計(jì)算機(jī)基礎(chǔ)知識(shí)有更深的理解,可以增強(qiáng)軟件開發(fā)基本訓(xùn)練。重在實(shí)踐,對很多現(xiàn)象要知其所以然。從這個(gè)意義上說,C+是軟件開發(fā)人員的“思維體操”。5參考書籍6C+編程環(huán)境的建立Windows平臺(tái)下C+的集成開發(fā)環(huán)境:Microsoft Visual C+Borland C+ BuilderLinux下可以采用命令行開發(fā)C+程序vi 編輯源文件gcc 編譯源文件 kdevelop 等IDE 7C+語言簡介二、C+程序的構(gòu)成 /* C+程序示例 */#include /系統(tǒng)頭文件using namespace std;int main() int a

3、,b,result; coutab; result=a+b; coutn The sum ofa+b=resultendl; 8C+語法 字符集英文字母: az,AZ數(shù)字: 09特殊字符:9C+語法詞法記號(hào)關(guān)鍵字: class, new, virtual, inline,bool,標(biāo)識(shí)符: hello, _t, v1,m_result操作符: +,-,*,/,文字: 數(shù)據(jù),字符串,字符,布爾文字分隔符: (), , , :, ; 10數(shù)據(jù)類型 布爾型 (bool)字符型 (char)整型 (int)基本數(shù)據(jù)類型實(shí)數(shù)型(float)自定義類型true or falseshort, long/si

4、gned, unsignedfloat, double, long doublesigned/unsignedtypedef 11常量聲明:由用戶自定義用法:- 必須初始化;-在定義后不能再改變其值常量類型: 整形常量,實(shí)型常量,字符常量, 字符串常量,布爾常量const T = ;12聲明:數(shù)據(jù)類型 變量名1,變量名2,變量名n變量變量在使用之前需要首先聲明其類型和名稱在聲明一個(gè)變量時(shí)可以給它賦初值變量的存儲(chǔ)類型:Auto:采用堆棧方式分配內(nèi)存空間,屬于暫時(shí)性存儲(chǔ),其存儲(chǔ)空間可被若干變量多次覆蓋使用。Register:存放在通用寄存器中。Extern:在所有程序和程序段中都可以引用。Stat

5、ic:在內(nèi)存中是以固定地址存放的,在整個(gè)程序運(yùn)行期間都有效。13枚舉類型將變量列舉出來就構(gòu)成了枚舉類型定義: enum ;e.g.- enum keyword ASM, AUTO, BREAK ;枚舉類型有默認(rèn)值,它們依次為: 0,1,2,;- ASM=0, AUTO=1, BREAK=2;也可以在申明時(shí)另行制定枚舉元素的值,如.- ASM=1, AUTO=5;BREAK=614數(shù)組數(shù)組是具有一定順序關(guān)系的若干對象的集合體,組成數(shù)組的對象稱為該數(shù)組的元素聲明:數(shù)據(jù)類型 標(biāo)識(shí)符常量表達(dá)式1常量表達(dá)式2常量表達(dá)式中數(shù)據(jù)類型必須是unsigned int初始化:- int v14 = 1, 2, 3

6、, 4 ;- char v2 = a, b, c, 0 ; - char v32 = a, b, 0 ;/error- char v43 = a, b, 0 ;/ok- int v52 3 = 1, 2, 3,4,5,6 ;數(shù)組名是一個(gè)常量,代表著數(shù)組在內(nèi)存中的起始地址15數(shù)組元素的調(diào)用數(shù)組名下標(biāo)1下標(biāo)2數(shù)組e.g.#ingculde Void main() int a10,b10; int i; for (i=0;i10;i+) ai=i*2-1; b10-i-1=ai; for (i=1;i10;i+) cout“a“i“”ai; cout“b“i“”biendl; 16結(jié)構(gòu)體結(jié)構(gòu)體是由不

7、同的數(shù)據(jù)類型組成的整體. 是類的簡單形式。結(jié)構(gòu)體聲明 Struct student /學(xué)生信息結(jié)構(gòu)體 int num; /學(xué)號(hào) char name20; /姓名,字符型數(shù)組 char sex; /性別 int age; /年齡 char score; /成績 char addr30 /住址17指針指針是用于存放內(nèi)存單元地址的數(shù)據(jù)類型聲明:數(shù)據(jù)類型 *標(biāo)識(shí)符 char c1 = a; char* p = &c1; char c2 = *p;內(nèi)存1000Ha.c1地址1000H3000Hpac2在上例中:P為指針變量,指向內(nèi)存地址*p為指針?biāo)赶虻膬?nèi)容,該內(nèi)存單元中的數(shù)據(jù)&c1為取出為變量c1分配

8、的地址18指針數(shù)組如果數(shù)組的每一個(gè)元素都是指針變量,這個(gè)數(shù)組就是指針數(shù)組,其元素為同一類型的指針聲明: 類型名T *數(shù)組名下表表達(dá)式int arr1=1,0,0,arr2=0,1,0,arr3=0,0,1;int *p3;p0=arr1; p1=arr2;p2=arr3;19指針指向數(shù)組的指針數(shù)組名就是一個(gè)指向它第一個(gè)元素地址的指針- int v = 1, 2, 3, 4 ;- int* p1 = v;- int* p2 = &v0;其他應(yīng)用:指針作為函數(shù)的參數(shù)指針型函數(shù) (返回值為指針類型)指向函數(shù)的指針 數(shù)據(jù)類型 (*函數(shù)指針)(形參表)對象指針20操作符釋放存儲(chǔ)空間- new/new:

9、創(chuàng)建動(dòng)態(tài)對象.- delete/delete: 釋放動(dòng)態(tài)對象. new ()/individual objects new ;/arrays- new/new 返回指向新分配內(nèi)存首地址的指針. delete ;/individual objects delete ;/arrays用delete銷毀用new創(chuàng)建的動(dòng)態(tài)存儲(chǔ)21函數(shù)1 函數(shù)的聲明2 返回值3 參數(shù)傳遞4 作用域5 函數(shù)重載6 帶默認(rèn)形參值的函數(shù)7 內(nèi)聯(lián)函數(shù)22函數(shù)的聲明函數(shù)必須先定義后調(diào)用.聲明中給出函數(shù)的名稱,返回值類型,以及行參的類型和數(shù)量調(diào)用其他函數(shù)的函數(shù)稱為主調(diào)函數(shù),被其他函數(shù)調(diào)用的函數(shù)稱為被調(diào)函數(shù)int number();

10、char* strcpy(char* to, const char* from);void exit(int); ();在函數(shù)聲明過程中可以不給出形參名稱23函數(shù)的聲明在函數(shù)聲明中可能包含參數(shù)名,但編譯器會(huì)忽略這些名字。參數(shù)傳遞在初始化進(jìn)行。參數(shù)類型將被檢查,并在必要時(shí)進(jìn)行強(qiáng)制類型轉(zhuǎn)化. double sqrt(double); /call sqrt() with the argument double(2) double sr2=sqrt(2); /error: sqrt() requires an argument of type double double sq3=sqrt(three)

11、;24函數(shù)的定義程序中調(diào)用的每一個(gè)函數(shù)都必須在某處定義.函數(shù)定義相當(dāng)于帶函數(shù)體的函數(shù)聲明 extern void swap(int*, int*);/a declaration void swap(int* p, int* q)/a definition int t=*p; *p=*q; *q=t; 聲明和定義的返回值類型必須相同.行參的標(biāo)識(shí)符可以不同,但類型必須相同.the body of the function25舉例說明#include void fun1(),fun2(),fun3();/函數(shù)聲明void main() coutIt is in main. endl; fun2();

12、 coutIt is back in main. endl;void fun1() coutIt is in fun1. endl; fun3(); coutIt is back in fun1. endl;26舉例說明/example41void fun2() coutIt is in fun2. endl; fun1(); coutIt is back in fun2. endl;void fun3() coutIt is in fun3. endl;It is in main.It is back in fun1.It is in fun2. It is back in fun2.It

13、is in fun1. It is back in main.It is in fun3.27返回值形參表(type1,type2,typen)作用是實(shí)現(xiàn)主調(diào)函數(shù)和被調(diào)函數(shù)的聯(lián)系函數(shù)的返回值由return語句給出無返回值的函數(shù)不必寫return,其類型表示符為void一個(gè)函數(shù)可以有多個(gè)返回值.return ;orreturn;28返回值 /1 is implicitly converted to double(1) double f() return 1; 對本地變量的指針和應(yīng)用不應(yīng)該作為返回值. int* fp() int local=1; return &local; /bad int&

14、fr() int local=1; return local; /bad-函數(shù)每調(diào)用一次,它的參數(shù)和本地變量都要被重新創(chuàng)建.返回值的類型將被檢查,所有標(biāo)準(zhǔn)的和自定義的類型將被轉(zhuǎn)化.29參數(shù)傳遞語法當(dāng)函數(shù)被調(diào)用時(shí),存儲(chǔ)器準(zhǔn)備接受行參(Formal arguments).行參將被相應(yīng)的實(shí)參初始化. 實(shí)參的類型將按行參類型檢查.();30參數(shù)傳遞的方式參數(shù)傳遞的方式 值調(diào)用引用調(diào)用值調(diào)用地址調(diào)用形參類型為C的各種數(shù)據(jù)類型31值調(diào)用/#include void swap1(int x,int y) int temp; temp=x; x=y; y=temp; coutx=x, y=yendl;void

15、 main() int a(5),b(9); swap1(a,b); couta=a, b=bendl;Output:x=9,y=5a=5,b=932地址調(diào)用#include void swap2(int *x,int *y) int temp; temp=*x; *x=*y; *y=temp; coutx=*x, y=*yendl;void main() int a(5),b(9); swap2(&a,&b); couta=a, b=bendl;Output:x=9,y=5a=9,b=533引用調(diào)用#include void swap3(int &x,int &y) int temp; te

16、mp=x; x=y; y=temp; coutx=x, y=yendl;void main() int a(5),b(9); swap3(a,b); couta=a, b=bendl;Output:x=9,y=5a=9,b=534引用調(diào)用#include int& f(int index,int a) int &r=aindex; /int r=aindex; return r;void main() int a=1,3,5,7,9; f(2,a)=11; for(i=0;i5;i+) coutait;pointer to as initial elementsOutput:13117a091

17、357a2r511r35參數(shù)調(diào)用值調(diào)用地址調(diào)用引用調(diào)用形式參數(shù)變量指針引用真實(shí)參數(shù)(常量, 變量) 值地址值變量值傳遞特性 直接把實(shí)參的值傳遞給形參形參為指向?qū)崊⒌闹羔樞螀⑹菍?shí)參的別名效果形參和實(shí)參相對獨(dú)立形參和實(shí)參的值同時(shí)變化形參和實(shí)參的值同時(shí)變化36參數(shù)傳遞常量參數(shù)目的:提高效率特點(diǎn):- 被調(diào)函數(shù)不能改變常量參數(shù)的值. void f(const Large& arg) /the value of arg cannot be changed without /explicit use of type conversion /assume that g() modifies arg void

18、g(Large& arg);37參數(shù)傳遞 int strlen(const char*); char* strcpy(char* to, const char* from); int strcmp(const char*, const char*); formal argumentsactualargumentsconstnon-constconst non-const- 文字,常量,需強(qiáng)制轉(zhuǎn)化的參數(shù)可以通過 const& argument來傳遞.38參數(shù)傳遞 float fsqrt(const float&); void g(double d) float r=fsqrt(2.0f); /p

19、ass ref to temp holding 2.0f r=fsqrt(r); /pass ref to r r=fsqrt(d); /pass ref to temp holding float(d) float update(float& i); void g(double d,float r) update(2.0f); /error:const argument update(r);/pass ref to r update(d);/error:type conversion required 39作用域作用域是指聲明的有效區(qū)域.文件作用域函數(shù)作用域塊作用域40作用域int a; /

20、文件作用域void main() int b; /函數(shù)作用域 If(b=0;b=10;b+) int c; /塊作用域 c+=b; 41函數(shù)重載兩個(gè)以上的函數(shù),取相同的函數(shù)名,但是形參的個(gè)數(shù)或者類型不同,這就是函數(shù)的重載。函數(shù)重載讓功能相近的函數(shù)在相同的作用域內(nèi)以相同的函數(shù)名定義,便于使用和記憶 void print(double); void print(long); void f() print(1L);/print(long) print(1.0);/print(double) print(1);/error:ambiguous 42函數(shù)重載注意的問題編譯器必須能夠找到要調(diào)用的函數(shù).調(diào)用

21、函數(shù)必須和形參最佳匹配:- 形參數(shù)量;- 形參類型;編譯器不能通過形參名來區(qū)分函數(shù)編譯器不能通過返回值來區(qū)分函數(shù)如果沒有最近匹配的函數(shù),將會(huì)出錯(cuò).函數(shù)重載與函數(shù)的聲明順序無關(guān).43函數(shù)重載void print(int);void print(const char*);void print(double);void print(long);void print(char);void h(char c, int i, short s, float f) print(c);/精確匹配: print(char) print(i); /精確匹配: print(int) print(s); /integr

22、al promotion: print(int) print(f); /float to double: print(double) print(c); /精確匹配: print(char) print(49); /精確匹配: print(int) print(0); /精確匹配: print(int) print(a); /精確匹配: print(const char*)44函數(shù)重載返回值不能用于區(qū)分函數(shù) int add(int ,int); void add(int,int);/error:重新定義形參名不能用于區(qū)分函數(shù) int add(int x,int y); void add(int

23、 a,int b);/error: 重新定義函數(shù)體的功能應(yīng)該類似.int add(int x,int y) return x+y; double add(double x,double y) return x-y; 45舉例說明#include int add(int,int); /形參類型不同double add(double,double); /void main() coutadd(5,10)endl; coutadd(5.0,10.5)endl;int add(int x,int y) coutintendl; return x+y;46舉例說明double add(double x,

24、double y) coutdoubleendl; return x+y;Output: int15double15.547舉例說明/#include int min(int a,int b);/形參數(shù)量不同int min(int a,int b,int c);/int min(int a,int b,int c,int d);/ void main() coutmin(13,5,4,9)endl; coutmin(-2,8,0)endl;int min(int a,int b) return ab?a:b;48舉例說明int min(int a,int b,int c) int t=min(

25、a,b); return min(t,c);int min(int a,int b,int c,int d) int t1=min(a,b); int t2=min(c,d); return min(t1,t2);Output: 4 -249帶默認(rèn)形參值的函數(shù)函數(shù)在定義時(shí)可以給出默認(rèn)的形參值調(diào)用時(shí)如果給出實(shí)參,則用實(shí)參初始化形參,如果沒有給出實(shí)參,則采用預(yù)先定義的默認(rèn)值; int add(int x,int y=0);or int add(int x,int y=0) return x+y; add(15);15+0add(15,10);15+1050帶默認(rèn)形參值的函數(shù)默認(rèn)形參值必須按從右向左

26、的順序定義. int add(int x,int y=5,int z=6);/ok int add(int x=1,int y=5,int z);/error int add(int x=1,int y,int z=6);/error默認(rèn)形參值應(yīng)該在函數(shù)原型中給出/默認(rèn)形參值在函數(shù)原型 中給出 int add(int x=5,int y=6); void main(void) add(); int daa(int x,int y) return x+y;51帶默認(rèn)形參值的函數(shù)在相同的作用域內(nèi),默認(rèn)形參的說明應(yīng)保持唯一,但如果在不同的作用域內(nèi),允許說明不同的默認(rèn)形參. 帶默認(rèn)形參值的函數(shù)重載時(shí)應(yīng)

27、注意. void fun(int x, int y=0); void fun(int x); void g() fun(3); /error,匹配不明確: fun(3) or fun(3,0)? 52帶默認(rèn)形參值的函數(shù) void fun(int x=7); /error:保持唯一 void fun(int x=8); void g() /ok:作用域不同 void fun(int x=9); / 53舉例說明/#include void fun(int a=1,int b=3,int c=5) couta=a, b=b, c=cendl;void main() fun(); fun(7); f

28、un(7,9); fun(7,9,11); coutOK! endl;Output:a=1,b=3,c=5a=7,b=3,c=5a=7,b=9,c=5a=7,b=9,c=11OK!54內(nèi)聯(lián)函數(shù)函數(shù)的調(diào)用會(huì)降低程序的執(zhí)行效率,因?yàn)檎{(diào)用函數(shù)時(shí)需要保存現(xiàn)場和地址,然后轉(zhuǎn)到子程序代碼起始地址執(zhí)行,完畢后轉(zhuǎn)回主調(diào)程序,為了提高效率,可以把一些功能簡單,規(guī)模效,使用率高的函數(shù)設(shè)計(jì)為內(nèi)聯(lián)函數(shù).內(nèi)聯(lián)函數(shù)不是在調(diào)用時(shí)發(fā)生控制轉(zhuǎn)移,而是在編譯時(shí)將函數(shù)體嵌入在每個(gè)調(diào)用語句處Normalinline55內(nèi)聯(lián)函數(shù)定義和應(yīng)注意的問題inline () /inline int add(int x,int y,int z)

29、return x+y+z;void main()int a(1),b(2),c(3),sum(0);sum=add(a,b,c);/replaced by sum=a+b+c; 56內(nèi)聯(lián)函數(shù)注意問題:- 內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在第一次被調(diào)用之前.- 內(nèi)聯(lián)函數(shù)體內(nèi)一般不能有循環(huán)和switch語句.- 內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口聲明.- 內(nèi)聯(lián)函數(shù)不能遞歸使用57 內(nèi)聯(lián)函數(shù)和 #define之間的區(qū)別#include #define f(x) x*xvoid main() int x(2); coutf(x)endl; coutf(x+1)endl;Output:45 #include inline

30、int f(int x)return x*x; void main() int x(2); coutf(x)endl; coutf(x+1)endl;Output:49 f(x) is replaced 2*2f(x+1) is repalced 2+1*2+1f(x) is replaced 2*2f(x+1) is repalced 3*358函數(shù)模板對于參數(shù)類型不同,但功能完全相同的函數(shù),用函數(shù)模板可以把它們編如一個(gè)函數(shù)體內(nèi)。函數(shù)模板可以用來創(chuàng)建一個(gè)通用功能的函數(shù),以支持多種不同形參,簡化重載函數(shù)的函數(shù)體設(shè)計(jì)定義:template 函數(shù)定義59舉例說明/求絕對值函數(shù)的模板#include

31、 Template T abs (T x)return x0? x : x;void main()int n=-5;double d=-5.5;Coutabs(n)endl; 輸出:Coutabs(d)endl; 5 5.560類與對象面向?qū)ο蟮乃枷隣OP的基本特點(diǎn)類概念和聲明對象構(gòu)造函數(shù)析構(gòu)函數(shù)內(nèi)聯(lián)成員函數(shù)拷貝構(gòu)造函數(shù)61面向?qū)ο蟮某绦蛟O(shè)計(jì)特點(diǎn)面向?qū)ο蟮某绦蛟O(shè)計(jì)方法就是運(yùn)用面向?qū)ο蟮挠^點(diǎn)來描述現(xiàn)實(shí)問題,然后用計(jì)算機(jī)語言來描述并處理該問題。這種描述和處理是通過類和對象實(shí)現(xiàn)的,是對現(xiàn)實(shí)問題的高度概括,分類和抽象.抽象:是指對具體問題(對象)進(jìn)行概括,抽出一類對象的公共性質(zhì)并加以描述的過程。封裝:

32、將抽象得到數(shù)據(jù)成員和代碼相結(jié)合,形成一個(gè)有機(jī)的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的行為進(jìn)行有機(jī)的結(jié)合。繼承:在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體更詳細(xì)的說明多態(tài):類中具有相似功能的不同函數(shù)使用一個(gè)名稱來實(shí)現(xiàn)62回顧:面向過程的設(shè)計(jì)方法重點(diǎn):如何實(shí)現(xiàn)細(xì)節(jié)過程,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個(gè)子模塊(main()+子函數(shù))。特點(diǎn):自頂向下,逐步求精功能分解。缺點(diǎn):效率低,程序的可重用性差。63面向?qū)ο蟮姆椒康模簩?shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。觀點(diǎn):自然界是由實(shí)體(對象)所組成。程序設(shè)計(jì)方法:使用面向?qū)ο蟮挠^點(diǎn)來描述模仿并處理現(xiàn)實(shí)問題。要求:高度概括、分類、和抽象。64OOP的基本特點(diǎn)-抽象抽象是對具體對象

33、(問題)進(jìn)行概括,抽出這一類對象的公共性質(zhì)并加以描述的過程。先注意問題的本質(zhì)及描述,其次是實(shí)現(xiàn)過程或細(xì)節(jié)。數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。代碼抽象:描述某類對象的共有的行為特征或具有的功能。抽象的實(shí)現(xiàn):通過類的聲明65抽象實(shí)例鐘表數(shù)據(jù)抽象:int Hour, int Minute, int Second代碼抽象:SetTime(), ShowTime()66抽象實(shí)例鐘表類class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,

34、Minute,Second;67OOP的基本特點(diǎn)-封裝將抽象出的數(shù)據(jù)成員、代碼成員相結(jié)合,將它們視為一個(gè)整體。目的是曾強(qiáng)安全性和簡化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。實(shí)現(xiàn)封裝:類聲明中的68封裝實(shí)例:class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second;邊界外部接口特定的訪問權(quán)限69OOP的基本特點(diǎn)-繼承與派生是C+中支持層次分類的一種機(jī)制,允許程序員在保持原有類特性的

35、基礎(chǔ)上,進(jìn)行更具體的說明。70OOP的基本特點(diǎn)-多態(tài)性多態(tài):同一名稱,不同的功能實(shí)現(xiàn)方式。目的:達(dá)到行為標(biāo)識(shí)統(tǒng)一,減少程序中標(biāo)識(shí)符的個(gè)數(shù)。實(shí)現(xiàn):重載函數(shù)和虛函數(shù)71c+中的類類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。72類類的定義數(shù)據(jù)成員 公有 訪問權(quán)限 私有類成員函數(shù) 保護(hù) class 類名 public: 成員函數(shù)、數(shù)據(jù)成員 private: 數(shù)據(jù)成員、成員函數(shù);73類舉例說明class Datepublic:

36、void SetDate(int y,int m,int d); int IsLeapYear(); void Print(); private: int year,month,day;/ 成員函數(shù)定義/關(guān)鍵字類名成員類型 分號(hào)成員函數(shù)數(shù)據(jù)成員74類訪問控制屬性: public, private, protected “public” 聲明了類的外部接口 “private” 只允許本類的成員函數(shù)訪問,而類外部任何訪問都是非法的“proctected”性質(zhì)與 “private”性質(zhì)相似,差別在于繼承過程中對產(chǎn)生新類影響不同 inline void Date:Print() coutyear.mo

37、nth.dayendl; void DataPrint(Date& d) coutd.year endl;/error:外部訪問非法 75類類的成員函數(shù)函數(shù)的原型聲明要寫在類的主題中. 定義:- 在類的主題內(nèi)定義;- 在類的外部定義.在類為定義時(shí),與一般函數(shù)稍有不同. 操作符 “:”函數(shù):類的成員;返回值類型 :()76舉例說明class Datepublic: void SetDate(int y,int m,int d); int IsLeapYear(); void Print() /類內(nèi)定義 coutyear.month.dayendl; ;private: int year,mont

38、h,day;void Date:SetDate(int y,int m,int n)/定義 year=y; month=m; day=d; 77類內(nèi)聯(lián)函數(shù):- 在類主體內(nèi)定義;- 在類的主體內(nèi)聲明,用 inline 在類體外定義.帶默認(rèn)值的成員函數(shù)重載78舉例說明/class Pointpublic:void Init(int initX,int initY);int GetX(); int GetY();Private: int X,Y;79舉例說明/inline void Point:Init(int initX,int initY) X=initX; Y=initY;inline int

39、 Point:GetX() return X;inline int Point:GetY() return Y;80舉例說明/類定義的完整實(shí)現(xiàn)#include class Datepublic: void SetDate(int y=2002,int m=10,int n=1); int IsLeapYear(); void Print() coutyear.month.dayendl;private: int year,month,day;void Date:SetDate(int y,int m,int n)81舉例說明/類定義的完整實(shí)現(xiàn) year=y; month=m; day=d;in

40、t Date:IsLeapYear() return (year%4=0 & year%100!=0)| (year%400=0);void main() Date date1,date2;82舉例說明/類定義的完整實(shí)現(xiàn) date1.SetDate();/默認(rèn)參數(shù) date2.SetDate(2000,10,1); coutdate2.IsLeapYear()endl; date1.Print(); date2.Print();Output: 12002.10.12000.10.183對象類的對象是該類的某一特定實(shí)體,即類類型的變量。聲明形式: 類名 對象名;例: Clock myClock;

41、84對象類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問 public 屬性的成員85對象的初始化5.3.1 構(gòu)造函數(shù)和析構(gòu)函數(shù)class Date/date.hpublic: Date(int yy,int mm,int dd)/構(gòu)造 y=yy; m=mm; d=dd; coutConstructor called. endl; Date()/析構(gòu) coutDestructor called. endl; void Print() couty.m.d.endl; private: int y,m,d;86構(gòu)造函數(shù)和析構(gòu)函數(shù)在對象被創(chuàng)建時(shí)利用特定的值構(gòu)造對象,將對象初始化為一個(gè)

42、特定的狀態(tài). 構(gòu)造函數(shù)與類同名.構(gòu)造函數(shù)能夠重載.構(gòu)造函數(shù)不能有返回值.在對象被創(chuàng)建時(shí)自動(dòng)調(diào)用. 用來完成對象將刪除前的一切清理工作.析構(gòu)函數(shù)名由類名前加()組成 .不接受任何參數(shù),不能被重載.析構(gòu)函數(shù)沒有返回值.析構(gòu)函數(shù)在對象生存期即將結(jié)束時(shí)由系統(tǒng)自動(dòng)調(diào)用. 87構(gòu)造函數(shù)和析構(gòu)函數(shù) Date today=Date(23,6,1983); Date xmas(25,12,1990); Date my_birthday;/error:沒有初始化 Date release1_0(10,12);/error:缺少形參class Date / Date(int y=2002,int m=10,int=

43、1);/缺省參數(shù) Date(int);/重載構(gòu)造函數(shù) Date(const char*);Date today;/Date today(2002,10,1);Date tomorrow(2);Date(July 4, 1998);88構(gòu)造函數(shù)和析構(gòu)函數(shù)拷貝初始化構(gòu)造函數(shù) int i(5); int j=i;/ 拷貝構(gòu)造 today(2002,10,10); Date tomorrow=today;/拷貝構(gòu)造 其功能是:使用一個(gè)類的對象來初始化該類的另一個(gè)新建對象。 .Format:類名:拷貝構(gòu)造函數(shù)名(const 類名&對象名)在類定義時(shí)沒有定義任何構(gòu)造函數(shù)時(shí),則編譯器自動(dòng)生成一個(gè)不帶參數(shù)的缺

44、省空構(gòu)造函數(shù)。 .89舉例說明/構(gòu)造和析構(gòu)/tpoint.hclass TPointpublic: TPoint(int x,int y) X=x;Y=y; TPoint(TPoint &p);/拷貝構(gòu)造函數(shù) TPoint() coutDestructor called.endl; int Xcoord() return X; int Ycoord() return Y;private: int X,Y;90舉例說明/構(gòu)造和析構(gòu)TPoint:TPoint(TPoint& p) X=p.X; Y=p.Y; coutCopy_initialization Constructor called.n;

45、#include #include tpoint.hTPoint f(TPoint Q);void main() TPoint M(20,35),P(0,0); TPoint N(M);M is a created object,N is a creating object91舉例說明/ P=f(N); coutP=P.Xcoord(), P.Ycoord()endl;TPoint f(TPoint Q) coutOK! endl; int x,y; x=Q.Xcoord()+10; y=Q.Ycoord()+20; TPoint R(x,y); return R;Pass by data v

46、alueReturn Rs data value92舉例說明Output:Copy_initialization Constructor called.Copy_initialization Constructor called.OK!Copy_initialization Constructor called.Destructor called.Destructor called.Destructor called.P=30,55Destructor called.Destructor called.Destructor called.Temporary object93類的應(yīng)用舉例一圓型游

47、泳池如圖所示,現(xiàn)在需在其周圍建一圓型過道,并在其四周圍上柵欄。柵欄價(jià)格為35元/米,過道造價(jià)為20元/平方米。過道寬度為3米,游泳池半徑由鍵盤輸入。要求編程計(jì)算并輸出過道和柵欄的造價(jià)。游泳池過道94#include const float PI = 3.14159;const float FencePrice = 35;const float ConcretePrice = 20;/聲明類Circle 及其數(shù)據(jù)和方法class Circle private: float radius; public: Circle(float r); /構(gòu)造函數(shù) float Circumference() c

48、onst; /圓周長 float Area() const; /圓面積;95/ 類的實(shí)現(xiàn)/ 構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle:Circle(float r)radius=r/ 計(jì)算圓的周長float Circle:Circumference() const return 2 * PI * radius; / 計(jì)算圓的面積 float Circle:Area() const return PI * radius * radius;96void main () float radius; float FenceCost, ConcreteCost; / 提示用戶輸入半徑 coutra

49、dius; / 聲明 Circle 對象 Circle Pool(radius); Circle PoolRim(radius + 3); 97/ 計(jì)算柵欄造價(jià)并輸出 FenceCost = PoolRim.Circumference() * FencePrice; cout Fencing Cost is ¥ FenceCost endl; / 計(jì)算過道造價(jià)并輸出 ConcreteCost = (PoolRim.Area() - Pool.Area()*ConcretePrice; cout Concrete Cost is ¥ ConcreteCost endl;運(yùn)行結(jié)果Enter the

50、 radius of the pool: 10Fencing Cost is ¥2858.85Concrete Cost is ¥4335.3998內(nèi)容類的繼承與派生類成員的訪問控制派生類的構(gòu)造、析構(gòu)函數(shù)類成員的標(biāo)識(shí)與訪問多態(tài)性運(yùn)算符重載虛函數(shù)純虛函數(shù)抽象類99繼承性和派生類 概念 - 繼承性:就是在一個(gè)已存在的類的基礎(chǔ)上建立一個(gè)新類- 基類:已存在的類稱為“基類”或“父類”- 派生類:新建立的類稱為“派生類”或“子類”基類和派生類的關(guān)系- 基類時(shí)派生類的提取,派生類是基類的具體化.- 派生類是基類的合成.- 派生類可以作為基類100繼承性和派生類繼承的目的:實(shí)現(xiàn)代碼重用。派生的目的:當(dāng)新的問

51、題出現(xiàn),原有程序無法解決(或不能完全解決)時(shí),需要對原有程序進(jìn)行改造。101概念單繼承和多繼承單繼承:一個(gè)類可以有多個(gè)派生類,但每個(gè)派生類只有一個(gè)基類多繼承: 一個(gè)派生類具有多個(gè)基類多層次繼承:一個(gè)派生類具有基類和間接基類。 102繼承方式不同繼承方式的影響主要體現(xiàn)在:1、派生類成員對基類成員的訪問控制。2、派生類對象對基類成員的訪問控制。三種繼承方式公有繼承私有繼承保護(hù)繼承103公有繼承(publlic): 基類的公有成員和保護(hù)成員成為派生類中的公有成員和保護(hù)成員。而基類的私有成員不能被派生類(新建立的部分)引用,只有基類的成員函數(shù)可以引用它 私有繼承(private):基類的公有成員和保護(hù)

52、成員成為派生類中的私有成員。而基類的私有成員成為派生類不可訪問的成員,只有基類的成員函數(shù)可以引用它 保護(hù)繼承(protected):基類的公有成員和保護(hù)成員成為派生類中的保護(hù)成員。而基類的私有成員成為派生類不可訪問的成員,只有基類的成員函數(shù)可以引用它 派生類的三種繼承方式 104派生類中的成員成員層次成員包括基類中的成員和派生類自身的成員.公有成員派生類私有成員公有成員公有成員私有成員公有成員基類新成員能被訪問105派生類定義格式class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2 派生類新定義成員 ;a、缺省繼承方式是私有繼承方式;b、根據(jù)不同的繼承方式,基類分別稱為公有基類、私

53、有基類和保護(hù)基類。106舉例說明class Locationpublic: void InitL(int xx,int yy); void Move(int xOff,int yOff); int GetX() return X; int GetY() return Y;private: int X,Y;void Location:InitL(int xx,int yy) X=xx; Y=yy;107舉例說明void Location:Move(int xOff,int yOff) X+=xOff; Y+=yOff;class Rectangle:public Location/公有繼承pub

54、lic: void InitR(int x,int y,int w,int h); int GetH() return H; int GetW() return W;private: int H,W;void Rectangle:InitR(int x,int y,int w,int h) InitL(x,y);108舉例說明 W=w; H=h;#include void main() Rectangle rect; rect.InitR(2,3,20,10); /可以訪問基類的GetX rect.Move(3,2); coutrect.GetX()“, rect.GetY(), rect.G

55、etH(), rect.GetW()endl;Output:5,5,10,20通過派生類的對象能訪問基類的public成員。109舉例說明class Rectangle:private Location/私有繼承public: void InitR(int x,int y,int w,int h); int GetH() return H; int GetW() return W;private: int W,H;void Rectangle:InitR(int x,int y,int w,int h) InitL(x,y);/直接繼承 W=w; H=h;110舉例說明#include voi

56、d main() Rectangle rect; rect.InitR(2,3,20,10); rect.Move(3,2); coutrect.GetX(), rect.GetY(), rect.GetH(), rect.GetW()endl;error通過派生類的對象不能訪問基類中的任何成員。111舉例說明class A protected: int x;int main() A a; a.X=5; /錯(cuò)誤通過派生類的對象不能訪問基類中的任何成員112舉例說明class A protected: int x;class B: public A public: void Function()

57、;void B:Function() X=5; /正確113派生類的構(gòu)造和析構(gòu)函數(shù)構(gòu)造函數(shù)基類的構(gòu)造函數(shù)不被繼承,派生類中需要聲明自己的構(gòu)造函數(shù)。聲明構(gòu)造函數(shù)時(shí),只需要對本類中新增成員進(jìn)行初始化,對繼承來的基類成員的初始化,自動(dòng)調(diào)用基類構(gòu)造函數(shù)完成。114構(gòu)造函數(shù)的語法形式派生類名:派生類名() :( 參數(shù)表-1),( 參數(shù)表-n 派生類新增成員的初始化語句;115派生類的構(gòu)造和析構(gòu)函數(shù)注意- 在構(gòu)造函數(shù)的參數(shù)表中,需要給出初始化基類數(shù)據(jù)、新增對象數(shù)據(jù)及一般成員數(shù)據(jù)所需的全部參數(shù). - 初始化順序是:& 基類構(gòu)造函數(shù)& 子對象構(gòu)造函數(shù)& 派生類構(gòu)造函數(shù)體中的內(nèi)容-多基類繼承時(shí)基類構(gòu)造函數(shù)的執(zhí)行

58、順序取決于定義派生類時(shí)所指定的各基類順序,與構(gòu)造函數(shù)列表順序無關(guān) .116舉例說明/構(gòu)造函數(shù)#include class B1public: B1(int i) b1=i; coutConstructor B1.endl; void Print() coutb1endl;private: int b1;class B2public: B2(int i) b2=i; coutConstructor B2.endl; void Print() coutb2endl;117舉例說明/private: int b2;class B3public: B3(int i) b3=i; coutConstru

59、ctor B3.endl; int Getb3() return b3;private: int b3;class A:public B2,public B1public: A(int i,int j,int k,int l);多基類繼承118舉例說明/example71 void Print();private: int a; B3 bb;A:A(int i,int j,int k,int l):B1(i),B2(j),bb(k) a=l; coutConstructor A. endl; void A:Print() B1:Print(); B2:Print(); coutabb.Getb

60、3()endl;對象聲明和定義時(shí)基類順序不同119舉例說明/example71void main() A aa(1,2,3,4); aa.Print();Constructor B2.2Constructor B1.1Constructor B3.3Constructor A.4124,3120析構(gòu)函數(shù)析構(gòu)函數(shù)不能被繼承。在執(zhí)行派生類的析構(gòu)函數(shù)時(shí),基類的析構(gòu)函數(shù)被調(diào)用 執(zhí)行順序從上往下 :- 派生類的析構(gòu)函數(shù) - 子對象析構(gòu)函數(shù) - 基類析構(gòu)函數(shù)析構(gòu)函數(shù)的定義方法與沒有繼承關(guān)系的析構(gòu)函數(shù)定義方法完全相同,只要在函數(shù)體中負(fù)責(zé)把派生類新增對象成員的清理工作做好就夠了,系統(tǒng)會(huì)自己調(diào)用基類及成員對象的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論