版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)第第4章章 類(lèi)和對(duì)象(二)類(lèi)和對(duì)象(二) 2C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.1 自引用指針自引用指針this 例例 4.1 this指針的引例。指針的引例。 #include class A public: A(int x1) x=x1; void disp() coutx= xendl; private: int x; ; main() A a(1),b(2); cout a: ; a.disp(); cout b: ; b.disp(); return 0; a.disp()與與b.disp()在存儲(chǔ)在存儲(chǔ)時(shí)是同一個(gè)函數(shù),它怎么時(shí)是同一個(gè)函數(shù),
2、它怎么區(qū)分是區(qū)分是a調(diào)用還是調(diào)用還是b調(diào)用它調(diào)用它呢?呢?3C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)1什么是this指針 4C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.2 顯示顯示this指針的值。指針的值。#includeclass A public: A(int x1) x=x1; void disp( ) coutnthis=thiswhen x=x; private: int x;main() A a(1),b(2),c(3); a.disp(); b.disp(); c.disp(); return 0; 5C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)為了幫助大家更深一步了解this指針是如何在
3、“幕后”工作的,我們?cè)倏匆粋€(gè)例子。假設(shè)有一段程序如下:class abc private: char a; int b;public: void init(char ma,int mb) a=ma;b=mb;main( )abs ob;ob.init(x,12);return 0;6C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì) ob.init(x,12); 那么C+如何使用this指針指向?qū)ο髈b呢?實(shí)際上,C+在編譯過(guò)程中做些了簡(jiǎn)單的工作,將上述調(diào)用init( )函數(shù)的語(yǔ)句轉(zhuǎn)換成如下形式: init(&ob,x,12); 換句話說(shuō), C+把類(lèi)對(duì)象作為參數(shù)傳遞給函數(shù)(傳地址)。雖然程序中的成員
4、函數(shù)init( )沒(méi)有對(duì)應(yīng)的形參,但程序編譯時(shí)C+將其轉(zhuǎn)換成以下形式: void init(abc *this,char ma,int mb) this-a=ma;this-b=mb; 由于函數(shù)調(diào)用時(shí),第一個(gè)參數(shù)是按照地址傳遞的,因此當(dāng)對(duì)象ob調(diào)用函數(shù)init()時(shí),this指針便指向ob,于是隱式指針this保證了成員函數(shù)init( )的操作對(duì)象確實(shí)是對(duì)象ob。7C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)何時(shí)顯式使用this指針? (1)當(dāng)需要在一個(gè)成員函數(shù)內(nèi)標(biāo)識(shí)被該成員函數(shù)操作的對(duì)象時(shí),就需要顯式使用this指針。8C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)#include class Sample
5、int x,y; public: Sample(int i=0,int j=0) x=i; y=j; void copy(Sample &xy); void print() coutx“,”yendl; ;void Sample:copy(Sample &xy) if(this=&xy) return; /通過(guò)判斷,避免不必要的復(fù)制 *this=xy; main() Sample p1,p2(5,6); p1.copy(p2); p1.print();9C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)(2)當(dāng)成員函數(shù)的形參名與該類(lèi)的數(shù)據(jù)成員同名時(shí),必須用this指針來(lái)顯式區(qū)分。#i
6、nclude class sam int a, b;public: sam(int a,int b) this-a=a;this-b=b;coutaendl; void print() couta= a b= bendl;main() sam s2(2,2);s2.print();return 0; 10C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)this指針的另外一個(gè)作用:獲取對(duì)象自身。因?yàn)閠his指針的值是對(duì)象自身的首地址,*this 是指針?biāo)赶虻膶?duì)象,即當(dāng)前對(duì)象。如果一個(gè)類(lèi)的成員函數(shù)返回值是*this,程序就可以用這個(gè)返回值去調(diào)用另外一個(gè)成員函數(shù)。11C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)【舉例
7、】#include class Classroom public: Classroom(int n=100,double l=8.0,double w=6.0); Classroom & set(int n,double l,double w); void print();private:int seats;double length,width;12C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)Classroom:Classroom(int n,double l,double w)seats=n0 ? n:100;length=l0? l:8.0;width=w0?w:6.0;Classroo
8、m & Classroom:set(int n,double l,double w)seats=n0 ?n:100;length=l0? l:8.0;width=w0?w:6.0;return *this;13C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)void Classroom:print() coutwidth meters width and length meters length, contains seats seats. endl;main()Classroom a101(80,6,4);coutClassroom a101 is ;a101.print();coutset a
9、nd print:endl;coutClassroom a101 is ;a101.set(90,7.0,5.0).print(); return 0; 14C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)this指針指針是一個(gè)const指針,不能在程序中修改它和給它賦值是一個(gè)局部數(shù)據(jù),它的作用域僅在一個(gè)對(duì)象內(nèi)部在系統(tǒng)中隱含存在。一般不必特別地去使用它。15C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.2 對(duì)象數(shù)組與對(duì)象指針 4.2.1 對(duì)象數(shù)組對(duì)象數(shù)組 所謂對(duì)象數(shù)組是指每一數(shù)組元素都是對(duì)象的數(shù)組。 定義一個(gè)一維數(shù)組的格式如下: 類(lèi)名 數(shù)組名下標(biāo)表達(dá)式; 16C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì) 例例4.4 對(duì)
10、象數(shù)組的應(yīng)用。對(duì)象數(shù)組的應(yīng)用。#includeclass exam public: void set_x(int n) x=n; int get_x() return x; private: int x; int main() exam ob4; int i; for (i=0;i4;i+) obi.set_x(i); for (i=0;i4;i+) coutobi.get_x() ; cout”操作符。 20C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì) 例例4.7對(duì)象指針的使用。對(duì)象指針的使用。 #include class exe public: void set_a(int a) x=a; vo
11、id show_a() coutxshow_a(); / 利用對(duì)象指針訪問(wèn)對(duì)象的成員 return 0; 21C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)2. 用對(duì)象指針訪問(wèn)對(duì)象數(shù)組 例如將例4.7的main()改寫(xiě)為: main() exe ob2,*p; ob0.set_a(10); ob1.set_a(20); p=ob; p-show_a(); p+; p-show_a(); return 0; 22C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.3 向函數(shù)傳遞對(duì)象 本節(jié)內(nèi)容中,把對(duì)象當(dāng)作普通變量理解就行了本節(jié)內(nèi)容中,把對(duì)象當(dāng)作普通變量理解就行了4.3.1 使用使用對(duì)象對(duì)象作為函數(shù)參數(shù)作為函數(shù)參數(shù)-值
12、傳遞值傳遞 4.3.2 使用使用對(duì)象指針對(duì)象指針作為函數(shù)參數(shù)作為函數(shù)參數(shù)-地址傳遞地址傳遞4.3.3 使用使用對(duì)象的引用對(duì)象的引用作為函數(shù)參數(shù)作為函數(shù)參數(shù)-形參值的改變就是形參值的改變就是改變實(shí)參值改變實(shí)參值 23C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.11 使用對(duì)象作為函數(shù)參數(shù)。使用對(duì)象作為函數(shù)參數(shù)。#includeclass aClass public: aClass(int n) i=n; void set(int n) i=n; int get( ) return i; private: int i; ;void sqr(aClass ob) ob.set(ob.get()*ob.
13、get(); coutcopy of obj has i value of ; coutob.get()n; main() aClass obj(10); sqr(obj); coutobj.i is unchanged in main:; coutobj.get( )endl; return 0; 24C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)【例】對(duì)象指針作函數(shù)參數(shù)示例。 # #include iostreaminclude .h class M class M public: public: M( ) x=y=0; M( ) x=y=0; M(int i,int M(int i,int j)
14、j) x=i;y=j; x=i;y=j; void copy(M *m); void setxy(int i,int j) x=i;y=j; void print( ) coutx“,”yx; y=m-y; void fun(M m1,M *m2); /一般函數(shù)說(shuō)明一般函數(shù)說(shuō)明 main( ) M p(5,7),q; /定義對(duì)象定義對(duì)象 q.copy(&p); fun(p,&q); p.print( ); q.print( ); 以p對(duì)象的地址為實(shí)參26C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì) void fun(M m1,M *m2) /一般函數(shù)定義一般函數(shù)定義 m1.setxy(
15、12,15); m2-setxy(22,25); 實(shí)參形參 形參pqm1m2 實(shí)參5 70 05 720082008過(guò)程調(diào)用中5 7200820085 75 75 722 25過(guò)程調(diào)用后27C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.12 使用對(duì)象指針作為函數(shù)參數(shù)。使用對(duì)象指針作為函數(shù)參數(shù)。#includeclass aClass public: aClass(int n) i=n; void set(int n) i=n; int get( ) return i; private: int i; ;void sqr(aClass *ob) ob-set(ob-get() * ob-get()
16、; coutCopy of obj has i value of ; coutget()n; main() aClass obj(10); sqr(&obj); coutobj.i in main has been changed :; coutobj.get() n; return 0; 28C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.13使用對(duì)象引用作為函數(shù)參數(shù)。使用對(duì)象引用作為函數(shù)參數(shù)。#includeclass aClass public: aClass(int n) i=n; void set(int n) i=n; int get( ) return i; private:
17、 int i; ;void sqr(aClass& ob) ob.set(ob.get() * ob.get(); coutCopy of obj has i value of ; coutob.get()n; main() aClass obj(10); sqr(obj); coutobj.i in main() has been changed :; coutobj.get() n; return 0; 29C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例#include class M public: M( ) x=y=0; M(int I,int j) x=I;y=j; void co
18、py(M &m); void setxy(int i,int j) x=I;j=j; void print( )coutx“,”yendl; private: int x,y; ;30C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)void M:copy(M &m) /成員函數(shù)定義成員函數(shù)定義 x=m.x; y=m.y; void fun(M m1,M &m2); /一般函數(shù)說(shuō)明一般函數(shù)說(shuō)明void main( ) M p(5,7),q; /定義對(duì)象定義對(duì)象 q.copy(p); fun(p, q); p.print( ); q.print( ); void fun(M m1,M
19、&m2) /一般函數(shù)定義一般函數(shù)定義 m1.setxy(12,15); m2.setxy(22,25); 31C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)參形參 形參pqm1m2 實(shí)參5 70 05 7過(guò)程調(diào)用中5 75 75 75 722 25過(guò)程調(diào)用后32C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.4 靜態(tài)成員 4.4.1 靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員 在一個(gè)類(lèi)中在一個(gè)類(lèi)中,若將一個(gè)數(shù)據(jù)成員說(shuō)明為若將一個(gè)數(shù)據(jù)成員說(shuō)明為static,這種成員稱(chēng)為靜態(tài)數(shù)據(jù)成員。這種成員稱(chēng)為靜態(tài)數(shù)據(jù)成員。 與一般的數(shù)據(jù)成員不同與一般的數(shù)據(jù)成員不同,無(wú)論建立多少個(gè)無(wú)論建立多少個(gè)類(lèi)的對(duì)象類(lèi)的對(duì)象,都只有一個(gè)靜態(tài)數(shù)據(jù)的拷貝
20、。從而都只有一個(gè)靜態(tài)數(shù)據(jù)的拷貝。從而實(shí)現(xiàn)了同一個(gè)類(lèi)的不同對(duì)象之間的數(shù)據(jù)共享實(shí)現(xiàn)了同一個(gè)類(lèi)的不同對(duì)象之間的數(shù)據(jù)共享。 定義靜態(tài)數(shù)據(jù)成員的格式如下定義靜態(tài)數(shù)據(jù)成員的格式如下: static 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 數(shù)據(jù)成員名數(shù)據(jù)成員名; 33C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.15靜態(tài)數(shù)據(jù)成員的使用引例。靜態(tài)數(shù)據(jù)成員的使用引例。#include#includeclass Student public: Student(char *name1,char *stu_no1,float score1); Student(); void show(); / 輸出姓名、學(xué)號(hào)和成績(jī)輸出姓名、學(xué)號(hào)和成績(jī) vo
21、id show_count_sum_ave(); /輸出人數(shù)、總成績(jī)和平均成績(jī)輸出人數(shù)、總成績(jī)和平均成績(jī) private: char *name; / 學(xué)生姓名學(xué)生姓名 char *stu_no; / 學(xué)生學(xué)號(hào)學(xué)生學(xué)號(hào) float score; / 學(xué)生成績(jī)學(xué)生成績(jī) static int count; / 統(tǒng)計(jì)學(xué)生人數(shù)統(tǒng)計(jì)學(xué)生人數(shù) static float sum; / 統(tǒng)計(jì)總成績(jī)統(tǒng)計(jì)總成績(jī) static float ave; / 統(tǒng)計(jì)平均成績(jī)統(tǒng)計(jì)平均成績(jī);34C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)Student:Student(char *name1,char *stu_no1,float s
22、core1 ) name=new charstrlen(name1)+1; strcpy(name,name1); stu_no=new charstrlen(stu_no1)+1; strcpy(stu_no,stu_no1); score=score1; +count; / 累加學(xué)生人數(shù)累加學(xué)生人數(shù) sum=sum+score; / 累加總成績(jī)累加總成績(jī) ave=sum/count; / 計(jì)算平均成績(jī)計(jì)算平均成績(jī) Student:Student() delete name; delete stu_no; -count; sum=sum-score; 35C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)
23、void Student:show() coutn name: name; coutn stu_no: stu_no; coutn score: score; void Student:show_count_sum_ave() coutn count: count; / 輸出靜態(tài)數(shù)據(jù)成員輸出靜態(tài)數(shù)據(jù)成員count coutn sum: sum; / 輸出靜態(tài)數(shù)據(jù)成員輸出靜態(tài)數(shù)據(jù)成員sum coutn ave: ave; / 輸出靜態(tài)數(shù)據(jù)成員輸出靜態(tài)數(shù)據(jù)成員aveint Student:count=0; / 靜態(tài)數(shù)員靜態(tài)數(shù)員count初始化初始化float Student:sum=0.0; /
24、靜態(tài)數(shù)員靜態(tài)數(shù)員sum初始化初始化float Student:ave=0.0; / 靜態(tài)數(shù)員靜態(tài)數(shù)員ave初始化初始化36C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)void main() Student stu1(Liming,990201,90); stu1.show(); stu1.show_count_sum_ave(); Student stu2(Zhanghao,990202,85); stu2.show(); stu2.show_count_sum_ave(); 1、靜態(tài)變量屬于類(lèi),為類(lèi)創(chuàng)建的所有對(duì)象所公用。、靜態(tài)變量屬于類(lèi),為類(lèi)創(chuàng)建的所有對(duì)象所公用。2、類(lèi)中的非靜態(tài)變量,在類(lèi)創(chuàng)建對(duì)象時(shí)
25、,不同的對(duì)、類(lèi)中的非靜態(tài)變量,在類(lèi)創(chuàng)建對(duì)象時(shí),不同的對(duì)象擁有各自的變量存儲(chǔ)空間。象擁有各自的變量存儲(chǔ)空間。3、靜態(tài)變量可以實(shí)現(xiàn)同一類(lèi)中不同對(duì)象間的數(shù)據(jù)共、靜態(tài)變量可以實(shí)現(xiàn)同一類(lèi)中不同對(duì)象間的數(shù)據(jù)共享。享。37C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)有關(guān)靜態(tài)成員變量的語(yǔ)法規(guī)定靜態(tài)成員變量要用靜態(tài)成員變量要用static聲明。聲明。靜態(tài)成員變量的初始化要在類(lèi)外單獨(dú)進(jìn)行,而且要在對(duì)象定義之前,靜態(tài)成員變量的初始化要在類(lèi)外單獨(dú)進(jìn)行,而且要在對(duì)象定義之前,一般在類(lèi)定義之后、一般在類(lèi)定義之后、main()之前初始化。之前初始化。 初始化的格式:初始化的格式: 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 類(lèi)名類(lèi)名:靜態(tài)數(shù)據(jù)成員名靜態(tài)數(shù)據(jù)
26、成員名=值值; 如如 int Student:count=0; 注意:初始化時(shí)數(shù)據(jù)成員名前面不加注意:初始化時(shí)數(shù)據(jù)成員名前面不加static。靜態(tài)成員變量屬于類(lèi),公有的靜態(tài)成員變量可以用靜態(tài)成員變量屬于類(lèi),公有的靜態(tài)成員變量可以用 類(lèi)名類(lèi)名:靜態(tài)數(shù)成靜態(tài)數(shù)成員名員名 的方式在類(lèi)外直接調(diào)用。(也可通過(guò)的方式在類(lèi)外直接調(diào)用。(也可通過(guò)對(duì)象對(duì)象調(diào)用,私有的靜態(tài)成調(diào)用,私有的靜態(tài)成員變量不能在類(lèi)外調(diào)用。)員變量不能在類(lèi)外調(diào)用。)與普通靜態(tài)變量一樣,在編譯時(shí)創(chuàng)建并初始化。在該類(lèi)的任何對(duì)象與普通靜態(tài)變量一樣,在編譯時(shí)創(chuàng)建并初始化。在該類(lèi)的任何對(duì)象被建立之前就已經(jīng)存在。被建立之前就已經(jīng)存在。靜態(tài)成員變量實(shí)際
27、代替了全局變量的作用。靜態(tài)成員變量實(shí)際代替了全局變量的作用。38C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例4.16公有靜態(tài)數(shù)據(jù)成員的訪問(wèn)。#include class myclasspublic:static int i;int geti()return i;int myclass:i=0;main()myclass:i=200;myclass ob1,ob2;coutob1.i=ob1.geti()endl;coutob2.i=ob2.geti()endl;ob1.i=300;coutob1.i=ob1.geti()endl;coutob2.i=ob2.geti()endl;return 0;3
28、9C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.17靜態(tài)數(shù)據(jù)成員和一般數(shù)據(jù)成員的不同。#include class Studentpublic:Student()+count;StudentNo=count; void print()coutstudentStudentNo ;coutcount=countendl;private:static int count;int StudentNo; ;int Student:count=0;main() Student student1; student1.print(); cout-靜態(tài)成員函數(shù)名靜態(tài)成員函數(shù)名(實(shí)參表實(shí)參表)41C+面向?qū)ο蟪绦蛟O(shè)計(jì)面
29、向?qū)ο蟪绦蛟O(shè)計(jì)例例4.18靜態(tài)成員函數(shù)來(lái)訪問(wèn)靜態(tài)數(shù)據(jù)成員。靜態(tài)成員函數(shù)來(lái)訪問(wèn)靜態(tài)數(shù)據(jù)成員。#include#includeclass Student private: char *name; / 學(xué)生姓名學(xué)生姓名 char *stu_no; / 學(xué)生學(xué)號(hào)學(xué)生學(xué)號(hào)float score; / 學(xué)生成績(jī)學(xué)生成績(jī)static int count; / 靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員,統(tǒng)計(jì)學(xué)生人數(shù)統(tǒng)計(jì)學(xué)生人數(shù) static float sum; / 靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員,統(tǒng)計(jì)總成績(jī)統(tǒng)計(jì)總成績(jī) public: Student(char *name1,char *stu_no1,float score1);
30、 Student(); void show(); / 普通成員函數(shù)普通成員函數(shù),輸出姓名、學(xué)號(hào)和成績(jī)輸出姓名、學(xué)號(hào)和成績(jī)static void show_count_sum(); / 靜態(tài)成員函數(shù)靜態(tài)成員函數(shù), 輸出學(xué)生人數(shù)和總成績(jī)輸出學(xué)生人數(shù)和總成績(jī);42C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)Student:Student(char *name1,char *stu_no1,float score1 ) name=new charstrlen(name1)+1; strcpy(name,name1); stu_no=new charstrlen(stu_no1)+1; strcpy(stu_n
31、o,stu_no1); score=score1; +count; / 累加學(xué)生人數(shù)累加學(xué)生人數(shù) sum=sum+score; / 累加總成績(jī)累加總成績(jī) Student:Student() delete name; delete stu_no; -count; sum=sum-score; 43C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)void Student:show() coutn name: name; coutn stu_no: stu_no; coutn score: score;void Student:show_count_sum() / 靜態(tài)成員函數(shù)靜態(tài)成員函數(shù) coutn coun
32、t: count; / 輸出靜態(tài)數(shù)據(jù)成員輸出靜態(tài)數(shù)據(jù)成員 coutn sum: sum; / 輸出靜態(tài)數(shù)據(jù)成員輸出靜態(tài)數(shù)據(jù)成員int Student:count=0; / 靜態(tài)數(shù)據(jù)成員初始化靜態(tài)數(shù)據(jù)成員初始化float Student:sum=0.0; / 靜態(tài)數(shù)據(jù)成員初始化靜態(tài)數(shù)據(jù)成員初始化44C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)void main() Student stu1(Liming,990201,90); stu1.show(); Student:show_count_sum(); / 使用類(lèi)名訪問(wèn)使用類(lèi)名訪問(wèn) 靜態(tài)成員函數(shù)靜態(tài)成員函數(shù) Student stu2(Zhanghao,
33、990202,85); stu2.show(); stu2.show_count_sum(); / 使用對(duì)象使用對(duì)象stu2訪問(wèn)訪問(wèn) 靜態(tài)成員函數(shù)靜態(tài)成員函數(shù) 45C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì) 有關(guān)靜態(tài)成員函數(shù)可以定義成內(nèi)嵌的,也可類(lèi)外定義,類(lèi)外定義時(shí)可以定義成內(nèi)嵌的,也可類(lèi)外定義,類(lèi)外定義時(shí)不要不要static。一般用來(lái)訪問(wèn)全局變量或同一類(lèi)中的靜態(tài)變量。一般用來(lái)訪問(wèn)全局變量或同一類(lèi)中的靜態(tài)變量。私有靜態(tài)成員函數(shù)不能被類(lèi)外部函數(shù)和對(duì)象訪問(wèn)私有靜態(tài)成員函數(shù)不能被類(lèi)外部函數(shù)和對(duì)象訪問(wèn)使用靜態(tài)成員函數(shù)可以在創(chuàng)建對(duì)象之前處理靜態(tài)使用靜態(tài)成員函數(shù)可以在創(chuàng)建對(duì)象之前處理靜態(tài)數(shù)據(jù)成員,這是普通函數(shù)所
34、不能實(shí)現(xiàn)的功能。數(shù)據(jù)成員,這是普通函數(shù)所不能實(shí)現(xiàn)的功能。靜態(tài)成員函數(shù)沒(méi)有靜態(tài)成員函數(shù)沒(méi)有this指針。一般不訪問(wèn)類(lèi)中的非指針。一般不訪問(wèn)類(lèi)中的非靜態(tài)成員靜態(tài)成員(變量、函數(shù)變量、函數(shù)),訪問(wèn)時(shí),要把對(duì)象作為參,訪問(wèn)時(shí),要把對(duì)象作為參數(shù)傳遞。數(shù)傳遞。46C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例4.19靜態(tài)成員函數(shù)訪問(wèn)非靜態(tài)數(shù)據(jù)成員。#include class small_catpublic: small_cat(double w) weight=w; total_weight+=w; total_number+; static void display(small_cat & w) co
35、utThe small_cat weights w.weightkgn; static void total_disp() couttotal_number small_cat total weight; couttotal_weight kg endl;private:double weight;static double total_weight;static double total_number;47C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)double small_cat:total_weight=0;double small_cat:total_number=0;main()small_
36、cat w1(0.9),w2(0.8),w3(0.7);small_cat:display(w1); small_cat:display(w2);w1.display(w3);w3.total_disp();return 0;48C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.5 友 元 友元既可以是不屬于任何類(lèi)的一般函數(shù)友元既可以是不屬于任何類(lèi)的一般函數(shù),也可以是另一個(gè)類(lèi)的成員函數(shù)也可以是另一個(gè)類(lèi)的成員函數(shù),還可以是整個(gè)還可以是整個(gè)的類(lèi)。的類(lèi)。 49C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.5.1 友元函數(shù) 友元函數(shù)不是當(dāng)前類(lèi)的成員函數(shù)友元函數(shù)不是當(dāng)前類(lèi)的成員函數(shù),而是獨(dú)立于而是獨(dú)立于當(dāng)前類(lèi)的外部函數(shù)
37、當(dāng)前類(lèi)的外部函數(shù),但它可以訪問(wèn)該類(lèi)的所有對(duì)象的但它可以訪問(wèn)該類(lèi)的所有對(duì)象的成員成員,包括私有成員、保護(hù)成員和公有成員。包括私有成員、保護(hù)成員和公有成員。1.將非成員函數(shù)聲明為友元函數(shù)將非成員函數(shù)聲明為友元函數(shù) 50C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.22 友元函數(shù)的使用。友元函數(shù)的使用。#include#includeclass girl public: girl(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; girl() delete name; friend void disp(girl &)
38、; /聲明友元函數(shù)聲明友元函數(shù) private: char *name; int age; ; void disp(girl &x) /定義友元函數(shù)定義友元函數(shù) coutGirls name is ,age:x.agen; void main() girl e(Chen Xinwei,18); disp(e); / 調(diào)用友元函數(shù)調(diào)用友元函數(shù) 友元函數(shù)沒(méi)有友元函數(shù)沒(méi)有this指指針!針!51C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)一個(gè)函數(shù)可以定義為多個(gè)類(lèi)的友元函數(shù)。一個(gè)函數(shù)可以定義為多個(gè)類(lèi)的友元函數(shù)。【例【例4.19 】(】(110頁(yè))頁(yè))52C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)
39、2.將成員函數(shù)聲明為友元函數(shù) 一個(gè)類(lèi)的成員函數(shù)也可以作為另一個(gè)類(lèi)的一個(gè)類(lèi)的成員函數(shù)也可以作為另一個(gè)類(lèi)的友元友元,這種成員函數(shù)不僅可以訪問(wèn)自己所在類(lèi)這種成員函數(shù)不僅可以訪問(wèn)自己所在類(lèi)對(duì)象中的所有成員對(duì)象中的所有成員,還可以訪問(wèn)還可以訪問(wèn)friend聲明語(yǔ)聲明語(yǔ)句所在類(lèi)對(duì)象中的所有成員。句所在類(lèi)對(duì)象中的所有成員。 這樣能使兩個(gè)類(lèi)相互合作、協(xié)調(diào)工作這樣能使兩個(gè)類(lèi)相互合作、協(xié)調(diào)工作,完完成某一任務(wù)。成某一任務(wù)。 53C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì) 例例4.24 一個(gè)類(lèi)的成員函數(shù)作為另一個(gè)類(lèi)的友元。一個(gè)類(lèi)的成員函數(shù)作為另一個(gè)類(lèi)的友元。 #include #include class girl; c
40、lass boy public:boy(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; void disp(girl &); / 聲明聲明disp()為類(lèi)為類(lèi)boy的成員函數(shù)的成員函數(shù) boy() delete name; private: char *name; int age; ; class girl public: girl(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; friend void boy:disp(gir
41、l &); girl() delete name; private: char *name; int age; ;54C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì) void boy:disp(girl &x) / 定義友元函數(shù)定義友元函數(shù)disp() coutBoys name is name,age:agen; /訪問(wèn)訪問(wèn)boy類(lèi)對(duì)象的成員類(lèi)對(duì)象的成員 coutGirls name is ,age:x.agen; /訪問(wèn)訪問(wèn)girl類(lèi)對(duì)象的成員類(lèi)對(duì)象的成員 void main() boy b(Chen Hao,25); girl e(Zhang Wei ,18); b.d
42、isp(e); 程序運(yùn)行結(jié)果如下程序運(yùn)行結(jié)果如下: Boys name is Chen Hao ,age: 25 Girls name is: Zhang Wei ,age: 18 類(lèi)的成員函數(shù)作為另一類(lèi)的友元時(shí),類(lèi)的成員函數(shù)作為另一類(lèi)的友元時(shí),該類(lèi)應(yīng)該先定義該類(lèi)應(yīng)該先定義55C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.5.2 友元類(lèi) 一個(gè)類(lèi)也可以作為另一個(gè)類(lèi)的友元。一個(gè)類(lèi)也可以作為另一個(gè)類(lèi)的友元。例如例如: : class Y class Y / / ; ; class X class X / / friend Y; / friend Y; / 聲明類(lèi)聲明類(lèi)Y Y為類(lèi)為類(lèi)X X的友元類(lèi)的友元類(lèi)
43、/ ; ; 一個(gè)類(lèi)被聲明為另一個(gè)類(lèi)一個(gè)類(lèi)被聲明為另一個(gè)類(lèi)的友元時(shí),它的所有成員的友元時(shí),它的所有成員函數(shù)都成為另一個(gè)類(lèi)的友函數(shù)都成為另一個(gè)類(lèi)的友元函數(shù)。元函數(shù)。56C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)【例】友元類(lèi)的示例。#include class Sample int x;public: Sample(int a)x=a; friend class Operation; /把類(lèi)Operation當(dāng)作友元(好朋友);57C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)class Operationpublic: int add(Sample& s1, Sample& s2) return
44、s1.x+s2.x; int subtract(Sample& s1, const Sample& s2) return s1.x-s2.x; ;int main( ) Sample s1(10) , s2(6); Operation obj; coutobj.add(s1, s2)endl; coutobj.subtract(s1, s2)endl; return 0;58C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.6 類(lèi)的組合 如果一個(gè)類(lèi)的對(duì)象是另一個(gè)類(lèi)的數(shù)據(jù)成員如果一個(gè)類(lèi)的對(duì)象是另一個(gè)類(lèi)的數(shù)據(jù)成員, ,則稱(chēng)則稱(chēng)這樣的數(shù)據(jù)成員為對(duì)象成員(子對(duì)象)。例如這樣的數(shù)據(jù)成員為對(duì)象成員(
45、子對(duì)象)。例如: : class A class A /. /. ; ; class B class B A a; / A a; /類(lèi)類(lèi)A A的對(duì)象的對(duì)象a a為類(lèi)為類(lèi)B B的對(duì)象成員的對(duì)象成員 public:public: / / ; ; 使用對(duì)象成員要注意的問(wèn)題是對(duì)象成員的初始化使用對(duì)象成員要注意的問(wèn)題是對(duì)象成員的初始化問(wèn)題問(wèn)題, ,即即類(lèi)類(lèi)B B的構(gòu)造函數(shù)如何定義的構(gòu)造函數(shù)如何定義? 59C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例如有以下的類(lèi)例如有以下的類(lèi): : class Xclass X 類(lèi)名類(lèi)名1 1 對(duì)象成員名對(duì)象成員名1;1; 類(lèi)名類(lèi)名2 2 對(duì)象成員名對(duì)象成員名2;2; 類(lèi)名類(lèi)名
46、n n 對(duì)象成員名對(duì)象成員名n;n; ; ; 一般來(lái)說(shuō)一般來(lái)說(shuō), ,類(lèi)類(lèi)X X的構(gòu)造函數(shù)的定義形式為的構(gòu)造函數(shù)的定義形式為; ;X:X(X:X(形參表形參表0):0):對(duì)象成員名對(duì)象成員名1(1(形參表形參表1),1), ,對(duì)象成員名對(duì)象成員名i(i(形參表形參表i) ,i) , ,對(duì)象成員名對(duì)象成員名n(n(形參表形參表n)n) / / 構(gòu)造函數(shù)體構(gòu)造函數(shù)體 60C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)練習(xí):寫(xiě)出程序的運(yùn)行結(jié)果練習(xí):寫(xiě)出程序的運(yùn)行結(jié)果#includeclass Object int val; public:Object( );/構(gòu)造函數(shù)Object( int i );/構(gòu)造函數(shù)O
47、bject( ); /析構(gòu)函數(shù);61C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)Object:Object( ) /默認(rèn)構(gòu)造函數(shù) val=0; coutn Default constructor for Object.n;Object:Object( int i) /構(gòu)造函數(shù)定義構(gòu)造函數(shù)定義 val=i; coutn Constructor for Object: valendl;Object:Object( )/析構(gòu)函數(shù)定義析構(gòu)函數(shù)定義 coutn Destructor for Object: valendl;62C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)class Container /定義新類(lèi),它含O
48、bject的對(duì)象 private:int date;Object one;/對(duì)象成員Object two;/對(duì)象成員 public:Container( );/構(gòu)造函數(shù)Container( int i, int j, int k);/構(gòu)造函數(shù)Container( ); /析構(gòu)函數(shù);63C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)Container:Container( ) /默認(rèn)構(gòu)造函數(shù)定義 date=0; coutn Default constructor for Container.n;Container:Container( int i, int j, int k):two(i),one(j)
49、date=k; coutn Constructor for Container.n; Container:Container( ) coutn Destructor for Container.n; int main( )/主程序 coutn. Entering main .n; Container obj(5, 6,10); coutn. Exiting main .n; return 0;64C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4-7 共享數(shù)據(jù)的保護(hù) 4.7.1 常引用 如果在說(shuō)明引用時(shí)用const修飾,則被說(shuō)明的引用為常引用。 常引用的說(shuō)明形式如下: const 類(lèi)型說(shuō)明符& 引
50、用名例如: int a=5; const int& b=a; 其中,b是一個(gè)常引用,它所引用的對(duì)象不允許更改。 65C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.28 常引用作函數(shù)形參。常引用作函數(shù)形參。#includeint add(const int& i,const int& j);void main() int a=20; int b=30; couta+b=add(a,b)endl;int add(const int& i,const& j) return i+j;66C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.7.2 常對(duì)象 如果在說(shuō)明對(duì)象時(shí)用如果
51、在說(shuō)明對(duì)象時(shí)用constconst修飾修飾, ,則被說(shuō)則被說(shuō)明的對(duì)象為常對(duì)象。明的對(duì)象為常對(duì)象。常對(duì)象的說(shuō)明形式如下常對(duì)象的說(shuō)明形式如下: : 類(lèi)名類(lèi)名 const const 對(duì)象名對(duì)象名(參數(shù)表參數(shù)表););或者或者 const const 類(lèi)名類(lèi)名 對(duì)象名對(duì)象名(參數(shù)表參數(shù)表);); 在定義對(duì)象時(shí)必須進(jìn)行初始化在定義對(duì)象時(shí)必須進(jìn)行初始化, ,而且不而且不能被更新。能被更新。 67C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.29 4.29 非常對(duì)象和常對(duì)象的比較。非常對(duì)象和常對(duì)象的比較。#includeiostream#include.h class Sample class Sample
52、 public:public: int int m; m; Sample(int i,int Sample(int i,int j) m=i; n=j; j) m=i; n=j; void setvalue(int void setvalue(int i) n=i; i) n=i; void disply() coutm=mendl void disply() coutm=mendl; ; coutn=nendl coutn=nendl; ; private:private: int int n; n;void main()void main() Sample a(10,20); a.setv
53、alue(40); Sample a(10,20); a.setvalue(40); a.m=30; a.disply a.m=30; a.disply();(); 68C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)4.7.3 常對(duì)象成員 1. 常數(shù)據(jù)成員常數(shù)據(jù)成員 使用使用const說(shuō)明的數(shù)據(jù)成員稱(chēng)為常數(shù)據(jù)成說(shuō)明的數(shù)據(jù)成員稱(chēng)為常數(shù)據(jù)成員。員。 如果在一個(gè)類(lèi)中說(shuō)明了常數(shù)據(jù)成員如果在一個(gè)類(lèi)中說(shuō)明了常數(shù)據(jù)成員,那那么構(gòu)造函數(shù)就只能通過(guò)初始化列表對(duì)該數(shù)么構(gòu)造函數(shù)就只能通過(guò)初始化列表對(duì)該數(shù)據(jù)成員進(jìn)行初始化據(jù)成員進(jìn)行初始化,而任何其他函數(shù)都不能而任何其他函數(shù)都不能對(duì)該成員賦值。對(duì)該成員賦值。 69C+面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)例例4.30 常數(shù)據(jù)成員舉例。常數(shù)據(jù)成員舉例。#include class Date public: Date(int y,int m,int d); void showDate(); const int &r; private: const int year ; const int
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版電廠煤炭采購(gòu)合同與環(huán)保型付款策略3篇
- 2025年碳晶片技術(shù)培訓(xùn)及咨詢(xún)合同3篇
- 開(kāi)發(fā)商繼續(xù)履行合同范本(2篇)
- 工廠員工勞動(dòng)合同(2篇)
- 二零二五版貨物代理合同范本3篇
- 二零二五年度棉花價(jià)格指數(shù)編制與應(yīng)用合同4篇
- 2025年度個(gè)人購(gòu)房借款合同物業(yè)管理服務(wù)協(xié)議3篇
- 二零二五年度中小企業(yè)應(yīng)收賬款質(zhì)押貸款合同范本4篇
- 2025年航空航天產(chǎn)業(yè)投資入股分紅合同3篇
- 2025年度租賃車(chē)輛智能監(jiān)控服務(wù)合同遠(yuǎn)程管理4篇
- 加強(qiáng)教師隊(duì)伍建設(shè)教師領(lǐng)域?qū)W習(xí)二十屆三中全會(huì)精神專(zhuān)題課
- 2024-2025學(xué)年人教版數(shù)學(xué)七年級(jí)上冊(cè)期末復(fù)習(xí)卷(含答案)
- 2025年慢性阻塞性肺疾病全球創(chuàng)議GOLD指南修訂解讀課件
- 2024年上海市中考數(shù)學(xué)真題試卷及答案解析
- 2024年全國(guó)卷1高考理綜試題及答案
- (完整版)金融市場(chǎng)基礎(chǔ)知識(shí)知識(shí)點(diǎn)歸納-圖文
- 五年級(jí)數(shù)學(xué)(小數(shù)乘除法)計(jì)算題專(zhuān)項(xiàng)練習(xí)及答案
- 小學(xué)數(shù)學(xué)知識(shí)結(jié)構(gòu)化教學(xué)
- 2022年睪丸腫瘤診斷治療指南
- 被執(zhí)行人給法院執(zhí)行局寫(xiě)申請(qǐng)范本
- 飯店管理基礎(chǔ)知識(shí)(第三版)中職PPT完整全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論